具有关联实体的 CakePHP3 PUT

CakePHP3 PUT with associated entity

今天遇到了一个问题,以前从来没有认真想过。我正在使用 friendsofcake/CRUD 插件并尝试更新具有 belongsTo() 关系的实体,如下所示:

class UsersTable extends Table {

     public function initilialize(array $config) 
     {
           $this->belongsTo('Organisations')
     ...

A angular 客户端调用 GET /users/1 检索以下数据:

$data = [
    'id' = 1,
    'username' => 'kylekatarn',
    'organistion_id' => 1,
    'organisation' => [
        'id' => 1,
        'label' => 'The Empire'
    ]
 ]; 

客户端还有来自GET /organistaions的所有可用组织的列表:

$organisations = [
    [
        'id' => 1,
        'label' => 'The Empire'
    ],[
        'id' => 2,
        'label' => 'Rebel Alliance'
    ]
] 

现在 Kyle Katarn 叛逃到叛军联盟,angular 叛军舰队命令用户数据库的客户端将这样的数据发送到 PUT /users/1:

$data = [
    'id' => 1,
    'username' => 'kylekatarn',
    'organisation_id' => 1,
    'organisation' => [
        'id' => 2,
        'label' => 'Rebel Alliance'
    ]
];

我的意图是用户 kylekatarn 应该从 organisation_id = 1 切换到在组织对象中找到的新组织。出于某种原因,我认为这应该开箱即用,但 ORM 为组织添加了一个新条目。

经过一番挖掘后,我发现组织实体并未设置 'id' 可访问。在我将 'id' 添加到可访问实体成员列表后,一切正常。

现在我的问题是,这是处理此类问题的好方法吗?将 id 设置为可访问是否有任何陷阱?或者在我的情况下用 user.organisation_id 更新关联实体会更好吗?

非常感谢!

如果你想将用户关联到不同的现有组织,那么你应该更改相应的外键字段,即 organisation_id,并保持 organisation 不变,或者最好不要甚至提交它,因为如果它包含具有非标量值的字段,它将被标记为脏(这意味着它应该被保存),即使提交的值与现有值相同。

如果您想更新当前关联的组织记录,您应该只修改 organisation(为此您必须传递当前主键,并且不必将其设置为可访问那个目的),或者如果你想创建一个新的组织并将其与用户相关联。

如果您想将用户关联到不同的现有组织,并在同一个保存操作中更新该组织,那么您 运行 就会遇到问题,因为这需要主键字段可访问(可批量分配)。