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);
}
}
我使用 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);
}
}