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

CakePHP 3.x:将updateAll()转换为save()循环,用于多编辑页面,cakephp,cakephp-3.x,Cakephp,Cakephp 3.x,我使用审计隐藏插件,它可以很好地处理我所有的表。但是我有一个特殊的函数,用户使用复选框选择行,然后将一个特定字段更改为所有行。该表包含一个名为“primary_key”的字段,该字段似乎不适用于这种情况 在我的控制器function中,我放置了以下内容: $this->request->data; $data = $this->request->data; if($this->request->is(['patch', 'post', 'put'])) {

我使用审计隐藏插件,它可以很好地处理我所有的表。但是我有一个特殊的函数,用户使用复选框选择行,然后将一个特定字段更改为所有行。该表包含一个名为“primary_key”的字段,该字段似乎不适用于这种情况

在我的控制器function中,我放置了以下内容:

$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()时,此尝试对我无效:


提前感谢。

多亏了格雷格,这段代码对我很有用:

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

多亏了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)
。这会从表中获取实体,并导致大量无用的查询

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

实际上,您不必为每个id调用
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);
    }
}

因此,对于每个id,您需要获取实体,对其进行修补,然后保存?你试过这些代码吗?我更新了我的问题。我尝试了$ids=$this->request->data('data.assetassignations.id')$资产状态标识=$this->request->data('asset\u status\u id');foreach($id as$id){$this->AssetsAssignations->saveMany(['asset\u status\u id'=>$asset\u status\u id])}
save
saveMany
都将实体作为参数;前者取一个,后者取一个数组。您需要
foreach
循环中一次获取、更新和
保存每个实体,或者
查找所有实体(使用
->where(['id in'=>$id])
),循环该集合以更新每个实体,然后
保存多个实体。如果有很多这样的记录,前者在内存使用方面会更好;如果是一个相当小的数字,后者可能会快一点。非常感谢@Greg。它起作用了:`$ids=$this->request->data('data.assetassignations.id')$资产状态标识=$this->request->data('asset\u status\u id')$AssetAssignationStable=TableRegistry::get('AssetAssignations');foreach($id as$id){$assetsAssignation=$assetsAssignationsTable->get($id);//返回id为$assetsAssignation->asset_status_id=$asset_status_id;$assetsAssignationsTable->save($assetsAssignation);}`因此,对于每个id,您都需要获取实体,对其进行修补,然后保存?你试过这些代码吗?我更新了我的问题。我尝试了$ids=$this->request->data('data.assetassignations.id')$资产状态标识=$this->request->data('asset\u status\u id');foreach($id as$id){$this->AssetsAssignations->saveMany(['asset\u status\u id'=>$asset\u status\u id])}
save
saveMany
都将实体作为参数;前者取一个,后者取一个数组。您需要
foreach
循环中一次获取、更新和
保存每个实体,或者
查找所有实体(使用
->where(['id in'=>$id])
),循环该集合以更新每个实体,然后
保存多个实体。如果有很多这样的记录,前者在内存使用方面会更好;如果是一个相当小的数字,后者可能会快一点。非常感谢@Greg。它起作用了:`$ids=$this->request->data('data.assetassignations.id')$资产状态标识=$this->request->data('asset\u status\u id')$AssetAssignationStable=TableRegistry::get('AssetAssignations');foreach($id as$id){$assetsAssignation=$assetsAssignationsTable->get($id);//返回id为$assetsAssignation->asset_status_id=$asset_status_id;$assetsAssignationsTable->save($assetsAssignation);}`。无需取消设置
isNew
?整洁技术。无需取消设置
isNew