CakePHP - Как обновить несколько записей - PullRequest
7 голосов
/ 04 мая 2011

Как я могу обновить одно поле из нескольких записей в 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));
}

но возникает ошибка: 1007 *

Неустранимая ошибка: вызов функции-члена saveField () для необъекта

Что я делаю не так?

Ответы [ 3 ]

18 голосов
/ 15 августа 2013

Я бы сказал, что вы должны использовать 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));
9 голосов
/ 04 мая 2011

Обновление: Обратите внимание, что это старый ответ, предназначенный для CakePHP 1.3.Для современного подхода, пожалуйста, обратитесь к ответ ниже .

Попробуйте это

foreach($items as $key => $item) {
    $this->Item->id = $item['Item']['id'];
    $this->Item->saveField('order', rand(1, 10));
}
2 голосов
/ 04 мая 2011

То, что вы делаете неправильно, это то, что $item не является объектом (равно как и items кстати), поэтому вы не можете вызывать какие-либо методы для этого.$items - это просто массив со всеми результатами вашей find() операции.

Вам нужно использовать метод saveAll() и использовать его для подходящего объекта, в данном случае $this->Item.

См. Нижнюю часть этой страницы из документации для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...