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