我有一个关于使用关联保存新实体的问题,该关联是belongsToMany关系。快速介绍一下。我有类似设置表和setting_values表的东西。用户通过名为users_settings的joinTable连接到设置。总结如下:
设置: id |名称
setting_values: id | setting_id |名字|价值|
users_settings: id | user_id | setting_id | setting_value_id
现在,在添加用户之前,我想用所有设置修补用户的实体,并为每个设置修补第一个setting_value。因此,users_settings现在具有连接到具有第一个值的用户的所有设置。但我不能让补丁或newEntity工作。所有型号都是烤制的,所以这应该没问题。这是我的代码
$(inherited) @executable_path/../Frameworks @loader_path/Frameworks
这是$settings = $this->Settings->find('all', [
'contain' => [
'SettingValues'
]
]);
$settingsData = [];
foreach ($settings as $setting) {
$settingsData[] = [
'setting_id' => $setting->id,
'setting_value_id' => $setting->setting_values[0]->id,
];
}
$data = [
'users_settings' => $settingsData
];
$user = $this->Users->patchEntity($user, $data, [
'associated' => [
'Settings.UsersSettings'
]
]);
实体的结果。正如你所看到的,没有任何东西被正确地编组:
$user
有人可以给我一个建议。感谢
答案 0 :(得分:2)
这不是belongsToMany
关联数据的结构,你必须提供目标,而不是连接表。可以通过特殊的_joinData
键提供其他连接表数据,即数据应如下所示:
$data = [
'settings' => [
[
'id' => 1,
'_joinData' => [
'setting_value_id' => 1
]
],
[
'id' => 2,
'_joinData' => [
'setting_value_id' => 5
]
]
]
];
这将填充连接表,如:
+----+---------+------------+------------------+
| id | user_id | setting_id | setting_value_id |
+----+---------+------------+------------------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 5 |
+----+---------+------------+------------------+
如果您(需要)使用associated
选项,请务必同时指定_joinData
键:
$user = $this->Users->patchEntity($user, $data, [
'associated' => [
'Settings._joinData'
]
]);
另见