Можно ли добавить условие в инструкцию обновления CakePHP?

Поскольку, похоже, нет никакой поддержки для оптимистической блокировки в CakePHP , я беру удар по созданию поведения, которое его реализует. После небольшого исследования поведения, я думаю, что я мог запустить запрос в событии beforeSave, чтобы проверить, не изменилось ли поле версии.

Однако я бы предпочел реализовать проверку, изменив предложение WHERE инструкции update из

WHERE id = ? 

в

 WHERE id = ? and version = ? 

Таким образом, мне не нужно беспокоиться о других запросах, изменяющих запись базы данных между моментом, когда я прочитал версию, и временем, когда я выполняю обновление. Это также означает, что я могу сделать один вызов базы данных вместо двух.

Я вижу, что метод DboSource.update() поддерживает условия, но Model.save() никогда не передает никаких условий.

Похоже, у меня есть несколько вариантов:

  1. Сделайте чек в beforeSave() и живите с тем, что он не пуленепробиваемый.
  2. Возьмите мою локальную копию CakePHP, чтобы проверить ключ conditions в массиве options Model.save() и передать его DboSource.update() .

Прямо сейчас, я склоняюсь к второму варианту, но это означает, что я не могу поделиться своим поведением с другими пользователями, если они не применяют мой хак к своей структуре.

Я пропустил более простой вариант?

При использовании save() для обновления записи Cake ожидает наличия id и будет обновлять только запись с этим id .

То, что вы ищете, – updateAll() :

updateAll(array $fields, array $conditions)

Обновляет многие записи за один раз. Записи, подлежащие обновлению, идентифицируются массивом $ conditions, а поля, подлежащие обновлению, вместе с их значениями идентифицируются массивом $ fields.

Например, чтобы одобрить всех пекарей, которые были членами более года, звонок для обновления может выглядеть примерно так:

 $this_year = date('Ymd h:i:s', strtotime('-1 year')); $this->Baker->updateAll( array('Baker.approved' => true), array('Baker.created <=' => "$this_year") ); 

Я пошел с взломом моей местной копии CakePHP. Недавно я не смотрел, чтобы увидеть, есть ли в последних версиях CakePHP новые параметры.