0

i have a question about saving a new entity with an association which is a belongsToMany relation. Just a quick introduction. I have something like a settings table and a setting_values table. The user is connected to the settings by a joinTable called users_settings. So in summary:

settings: id | name

setting_values: id | setting_id | name | value |

users_settings: id | user_id | setting_id | setting_value_id

Now before the user is added I want to patch the entity of the user with all settings and the first setting_value for each setting. So that users_settings has now all settings connected to the user with the first value. But I can't get the patch or the newEntity to be work. All models are baked so this should be fine. Here's my code

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

This is the result in the $user entity. As you can see nothing is corretly marshaled:

users_settings => [
    (int) 0 => [
        setting_id => (int) 1,
        setting_value_id => (int) 1
    ],
    (int) 1 => [
        setting_id => (int) 2,
        setting_value_id => (int) 5
    ]
]

Can someone give me an advice on this. Thanks

ndm
  • 59,784
  • 9
  • 71
  • 110
Yetispapa
  • 2,174
  • 2
  • 30
  • 52

1 Answers1

2

That's not how belongsToMany association data should be structured, you have to supply the target, not the join table. Additional join table data can be supplied via the special _joinData key, ie the data should look like:

$data = [
    'settings' => [
        [
            'id' => 1,
            '_joinData' => [
                'setting_value_id' => 1
            ]
        ],
        [
            'id' => 2,
            '_joinData' => [
                'setting_value_id' => 5
            ]
        ]
    ]
];

That would populate the join table like:

+----+---------+------------+------------------+
| id | user_id | setting_id | setting_value_id |
+----+---------+------------+------------------+
| 1  | 1       | 1          | 1                |
| 2  | 1       | 2          | 5                |
+----+---------+------------+------------------+

And if you (need to) use the associated option, then make sure to specify the _joinData key too:

$user = $this->Users->patchEntity($user, $data, [
    'associated' => [
        'Settings._joinData'
    ]
]);

See also

ndm
  • 59,784
  • 9
  • 71
  • 110