Как я могу обновить одно поле нескольких записей в CakePHP?
Я извлекаю несколько записей, используя $this->Item->find('all')
и мне нужно установить разные значения для каждого из них и сохранить. я делаю
$items = $this->Item->find('all', array( 'fields' => array('Item.id', 'Item.order'), 'conditions'=> array( 'Item.project_id =' => $this->request->params['project_id'], ), 'order' => array ('Item.order ASC') )); foreach($items as $key => $item) { $item->saveField('Item.order', rand(1, 10)); }
но это вызывает ошибку, говоря
Неустранимая ошибка: вызов функции-члена saveField () для не-объекта
Что я делаю не так?
Обновление: обратите внимание, что это старый ответ, предназначенный для CakePHP 1.3. Для современного подхода см. Ответ ниже .
Попробуй это
foreach($items as $key => $item) { $this->Item->id = $item['Item']['id']; $this->Item->saveField('order', rand(1, 10)); }
Я бы сказал, что вы должны использовать CakePHP Save Many для повышения производительности.
Пример:
$data = array( array( 'Item' => array('id' => 2, 'order' => rand(1,5)) ), array( 'Item' => array('id' => 3, 'order' => rand(1,5)) ), ); $Model->saveMany($data, array('deep' => true));
То, что вы делаете неправильно, состоит в том, что $item
не является объектом (и не является items
btw), поэтому вы не можете вызывать какие-либо методы. $items
– это всего лишь массив со всеми результатами операции find()
.
Что вам нужно сделать, так это использовать метод saveAll()
и использовать его в соответствующем объекте, $this->Item
в этом случае.
Более подробную информацию см. В нижней части этой страницы из документации .