【问题标题】:CakePHP3 PUT with associated entityCakePHP3 PUT 与关联实体
【发布时间】:2018-06-22 08:13:17
【问题描述】:

今天我偶然发现了一个我以前从未真正考虑过的问题。我正在使用friendsofcake/CRUD 插件并尝试使用belongsTo() 关系更新实体,如下所示:

class UsersTable extends Table {

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

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 投奔 Rebel Alliance,Rebel 舰队命令用户数据库的 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 更新关联实体会更好吗?

非常感谢!

【问题讨论】:

    标签: associations entity cakephp-3.0 put


    【解决方案1】:

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

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

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

    【讨论】:

    • 好的,感谢 ndm 的可理解回答。我认为在我的情况下,我会改回可访问的 id 并让客户端发送 organization_id 以防组织发生更改,如果用户应该进入一个全新的组织,则发送对象组织。
    猜你喜欢
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多