PHP Activerecord: обновление массива объектов - PullRequest
2 голосов
/ 26 февраля 2012

Следующий код вернет массив PHP Activerecord Объекты:

$book = Book::find('all');

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

$book[0]->title = 'my first book';
$book[0]->author = 'Danny DeVito';
$book[4]->title = 'Nice Title';

, чтобы сохранить вышеперечисленное, мне нужно будет вызвать метод ->save() для каждого объекта

$book[0]->save();
$book[4]->save();

  1. Есть ли лучший способ сделать это?встроенная PHP ActiveRecord функция, которая сохраняет все члены данного массива объектов или основана на ассоциации?

  2. Если исходный заголовок $book[4] выше уже был "Хорошим заголовком", будет ли метод ->save() с учетом $book[4] изменен и продолжится сохранение базы данных?

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Попробуйте использовать обновление всех инст

$update = array();
$update['title'] = 'my first book';
$update['author'] = 'Danny DeVito' ;

$book[0]->update_all(array('set' =>$update));
$book[4]->update_all(array('set' =>array("title"=>"Nice Title"));

Я думаю, что это должно быть чище

1 голос
/ 27 февраля 2012

После долгих исследований я решил опубликовать свои выводы / ответы:

Нет такой библиотечной функции ActiveRecord, которая может обновлять массив объектов с уникальными значениями.

Если предположить, что Activerecord выполнит один запрос на обновление, это будет выглядеть так:

UPDATE books
   SET title = CASE id
      WHEN 0 THEN 'my first book'
      WHEN 4 THEN 'Nice Title'
   END,
   author = CASE id
      WHEN 0 THEN 'Danny DeVito'
   END
WHERE id IN (0,4)

Тот же вопрос, что и ", как мне обновить несколько строк с разными значениями одновременно ". Это противоречило бы дизайну модели Activerecord, поскольку объект представляет строку и отображает строки в таблицах. Очевидное ограничение для такой простой модели для работы.

Любое присвоение атрибутам объекта вызывает «грязный» флаг на этот атрибут, и любой последующий вызов для обновления / сохранения этого объект будет инициировать запрос, даже если назначенное значение атрибута совпадает с предыдущим значением базы данных / модели. Вызывая Метод save (), когда никакие назначения не были сделаны, не вызывает это запрос.

...