Обновление и удаление
И update(), и delete() управляются условием Qb для секции WHERE и
возвращают число затронутых строк. И условие, и новые значения привязываются —
ничто не подставляется в SQL напрямую.
Обновление строк
Передайте таблицу, новые значения и условие Qb. Возвращаемое значение — число
изменённых строк.
use Flytachi\Winter\Cdo\Qb;
$affected = $cdo->update('users',
['name' => 'Alice Smith', 'updated_at' => date('Y-m-d H:i:s')],
Qb::eq('id', 1)
);
echo $affected; // число обновлённых строкНовые значения превращаются в SET name = :S_name, ... с типизированными
привязками, а фрагмент Qb становится WHERE. Оба набора плейсхолдеров
различны, поэтому колонка может встречаться и в SET, и в условии без коллизии.
Нет условия — нет защиты WHERE
update() и delete() всегда выдают фрагмент Qb как WHERE. Если вы построите
условие, которое окажется пустым (например, все необязательные фильтры были
пропущены), вы можете получить UPDATE/DELETE без WHERE и затронуть каждую
строку. Защищайтесь от пустого Qb перед вызовом — см.
динамические фильтры.
Обновление со составным условием
Любая композиция Qb работает как WHERE:
$affected = $cdo->update('users',
['status' => 'inactive'],
Qb::and(
Qb::lt('last_login', '2024-01-01'),
Qb::eq('status', 'active'),
)
);Удаление строк
delete() принимает таблицу и условие Qb и возвращает число удалённых строк:
// по id
$deleted = $cdo->delete('users', Qb::eq('id', 1));
// по множеству id
$deleted = $cdo->delete('users', Qb::in('id', [1, 2, 3]));
// по составному условию
$deleted = $cdo->delete('sessions',
Qb::and(
Qb::lt('expires_at', date('Y-m-d H:i:s')),
Qb::eq('is_active', false),
)
);Значения привязываются, в том числе в SET
Значения обновления проходят через тот же типозависимый связыватель, что и всё
остальное: массив становится JSON, int привязывается как целое,
DateTimeInterface становится Y-m-d H:i:s. Можно передавать сложные значения
напрямую:
$cdo->update('products',
['attributes' => ['color' => 'red', 'size' => 'M']], // привязано как JSON
Qb::eq('id', 42)
);Полную карту типов см. в Привязке параметров.
Связанное
- Построение условий — композиция
WHEREизQb - Апсерты — вставка-или-обновление вместо слепого обновления
- API CDO — сигнатуры
update/delete - Обработка ошибок — перехват нарушений ограничений