Пакет · cdo

Обновление и удаление

И update(), и delete() управляются условием Qb для секции WHERE и возвращают число затронутых строк. И условие, и новые значения привязываются — ничто не подставляется в SQL напрямую.

Обновление строк

Передайте таблицу, новые значения и условие Qb. Возвращаемое значение — число изменённых строк.

php
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:

php
$affected = $cdo->update('users',
  ['status' => 'inactive'],
  Qb::and(
      Qb::lt('last_login', '2024-01-01'),
      Qb::eq('status', 'active'),
  )
);

Удаление строк

delete() принимает таблицу и условие Qb и возвращает число удалённых строк:

php
// по 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. Можно передавать сложные значения напрямую:

php
$cdo->update('products',
  ['attributes' => ['color' => 'red', 'size' => 'M']], // привязано как JSON
  Qb::eq('id', 42)
);

Полную карту типов см. в Привязке параметров.

Связанное