Cakephp 3 - 保存关联的belongsToMany(joinTable)

时间:2017-06-08 14:47:28

标签: php cakephp orm associations cakephp-3.0

我有一个关于使用关联保存新实体的问题,该关联是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

有人可以给我一个建议。感谢

1 个答案:

答案 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'
    ]
]);

另见