CakePHP 3.x: преобразование updateAll () в цикл save () для нескольких страниц редактирования - PullRequest
0 голосов
/ 12 июня 2018

Я использую плагин audit-stash, который отлично работает со всеми моими таблицами.Но у меня есть особая функция, в которой пользователь выбирает строки с флажками, а затем меняет определенное поле на все из них.Таблица Audits содержит поля с именем «primary_key», которые, кажется, не работают в этом случае.

в моем контроллере, функция, я поместил это:

$this->request->data;
$data = $this->request->data;
if($this->request->is(['patch', 'post', 'put'])) 
{
    $ids = $this->request->data('data.AssetsAssignations.id');
    $room_id = $this->request->data('room_id');

    $this->AssetsAssignations->updateAll(
        ['room_id ' => $room_id ],
        ['id IN' => $ids]
    );

}

в моей таблице, я использовал это:

$this->addBehavior('AuditStash.AuditLog');

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

Мне предложили обновитьзаписывает одну за другой, если мне нужно вести журнал.

Как я могу преобразовать свой код updateAll () в цикл Save ()?

Эта попытка не сработала для меня, используя save() и saveMany ():

$this->request->data;
    $data = $this->request->data;

    if($this->request->is(['patch', 'post', 'put'])) 
    {
        $ids = $this->request->data('data.AssetsAssignations.id');
        $asset_status_id = $this->request->data('asset_status_id');
        foreach($ids as $id) {
            $this->AssetsAssignations->saveMany(
                ['asset_status_id ' => $asset_status_id ]
            );

        }
    }

заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

На самом деле вам не нужно звонить get($id) для каждого идентификатора.Это получает сущность из таблицы и вызывает множество бесполезных запросов

if($this->request->is(['patch', 'post', 'put'])) 
{
    $ids = $this->request->data('data.AssetsAssignations.id');
    $asset_status_id = $this->request->data('asset_status_id');
    $assetsAssignationsTable = TableRegistry::get('AssetsAssignations');
    foreach($ids as $id) {
        $assetsAssignation = $assetsAssignationsTable->newEntity(); // returns an empty entity
        $assetsAssignation->id = $id; // assign the id to the entity
        $assetsAssignation->asset_status_id = $asset_status_id;
        $assetsAssignationsTable->save($assetsAssignation);
    }
}
0 голосов
/ 14 июня 2018

Спасибо Грегу, у меня сработал этот код:

use Cake\ORM\TableRegistry;
...
if($this->request->is(['patch', 'post', 'put'])) 
    {
        $ids = $this->request->data('data.AssetsAssignations.id');
        $asset_status_id = $this->request->data('asset_status_id');
        $assetsAssignationsTable = TableRegistry::get('AssetsAssignations');
        foreach($ids as $id) {
            $assetsAssignation = $assetsAssignationsTable->get($id); // Return assetsAssignation with id 
            $assetsAssignation->asset_status_id = $asset_status_id;
            $assetsAssignationsTable->save($assetsAssignation);
        }
    }
...