Поскольку, похоже, нет никакой поддержки для оптимистической блокировки в CakePHP , я беру удар по созданию поведения, которое его реализует. После небольшого исследования поведения, я думаю, что я мог запустить запрос в событии beforeSave, чтобы проверить, не изменилось ли поле версии.
Однако я бы предпочел реализовать проверку, изменив предложение WHERE инструкции update из
WHERE id = ?
в
WHERE id = ? and version = ?
Таким образом, мне не нужно беспокоиться о других запросах, изменяющих запись базы данных между моментом, когда я прочитал версию, и временем, когда я выполняю обновление. Это также означает, что я могу сделать один вызов базы данных вместо двух.
Я вижу, что метод DboSource.update()
поддерживает условия, но Model.save()
никогда не передает никаких условий.
Похоже, у меня есть несколько вариантов:
beforeSave()
и живите с тем, что он не пуленепробиваемый. 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 новые параметры.