CakePHP 3.x : 将 updateAll() 转换为 save() 循环,用于多编辑页面

CakePHP 3.x : transform updateAll() into save() loop, for a multiple edit page

我使用 audit-stash 插件,它适用于我所有的 table。但是我有一个特定的功能,用户可以在其中选择带有复选框的行,然后将特定字段更改为所有这些行。 table 审计包含一个名为 "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]
    );

}

在我的 table 中,我使用了这个:

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

我被告知对于 audit-stash 没有办法解决这个问题,因为 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 ]
            );

        }
    }

提前致谢。

感谢 Greg,这段代码对我有用:

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);
        }
    }

实际上,您不必为每个 ID 都调用 get($id)。这从 table 获取实体并导致大量无用的查询

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);
    }
}