在Cakephp 3.x中保存对关联实体的手动更改

时间:2018-07-31 09:15:18

标签: cakephp orm cakephp-3.0 entities

我试图保存一个实体,并在此过程中更改其关联数据中的某些属性。我以为这样可以,但是显然不行:

$user = $this->Users->get(2, ['contain' => 'Spots']);

$user->name = "newUserName";
$user->spots[2]->name = 'newSpotName';

$this->Users->save($user);

保存的用户名称很好,但是现货名称不是。

我能够找到的所有问题都与保存的数据有关。有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:1)

手动更改关联的实体时(与使用Table::patchEntity()相对),必须确保将关联的相应属性名称标记为脏(仅保存脏实体/属性)。

因此,在您的情况下,User::$spots应该很脏:

// ...
$user->spots[2]->name = 'newSpotName';

$user->setDirty('spots', true); // dirty() in CakePHP < 3.4

如果实体需要更深入地嵌套,例如$user->foo->bar->spots,则该链中的所有属性都必须是肮脏的:

$user->foo->bar->spots[2]->name = 'newSpotName';

$user->foo->bar->setDirty('spots', true);
$user->foo->setDirty('bar', true);
$user->setDirty('foo', true);

另请参见

答案 1 :(得分:-1)

请参考https://book.cakephp.org/3.0/en/orm/saving-data.html#saving-associations

$this->Users->save($user, ['associated' => ['Spots']]);

我希望这对您有用。

最好的运气。