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

Saving manual changes to associated entities in Cakephp 3.x

我正在尝试保存实体并在此过程中更改其关联数据中的某些属性。我以为这行得通,但显然行不通:

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

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

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

用户名保存的很好,但是点名没有。

我能找到的所有问题都与正在保存的数据有关。谁能告诉我我做错了什么?

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

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

我希望这对你有用。

预祝好运

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

所以在你的情况下 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);

另见