CakePHP3与关联实体的PUT

时间:2018-06-22 08:13:17

标签: associations entity cakephp-3.0 put

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

class UsersTable extends Table {

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

有角客户致电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)叛军加入了叛军,叛军舰队命令的有角客户端用户数据库将这样的数据发送给了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更新关联的实体会更好吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

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

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

如果您想将用户关联到其他现有组织,并以相同的保存操作更新该组织,那将是您遇到问题的原因,因为这将要求可访问主键字段(可分配质量) )。