今天,我偶然发现了一个以前从未真正想到过的问题。我使用的是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
更新关联的实体会更好吗?
非常感谢!
答案 0 :(得分:1)
如果要将用户与其他现有组织关联,则应更改相应的外键字段,即organisation_id
,并保留organisation
不变,或者最好不要提交它,因为如果它包含具有非标量值的字段,即使提交的值与现有值相同,它也会被标记为“脏”(这意味着它应该被保存)。
如果要更新当前关联的组织记录,则只应修改organisation
(为此,您必须传递当前的主键,并且不必为此设置它是可访问的) ),或者如果您要创建新的组织并将其与用户相关联。
如果您想将用户关联到其他现有组织,并以相同的保存操作更新该组织,那将是您遇到问题的原因,因为这将要求可访问主键字段(可分配质量) )。