Cakephp 3 — Сохранить связанные принадлежащие ToMany (joinTable)

У меня есть вопрос о сохранении новой сущности с ассоциацией, которая является принадлежностью ToMany. Просто краткое введение. У меня есть что-то вроде таблицы настроек и таблицы setting_values. Пользователь подключен к настройкам с помощью присоединяемой таблицы с именем users_settings. Итак, в заключение:

настройки:
id | название

setting_values:
id | setting_id | имя | значение |

users_settings:
id | user_id | setting_id | setting_value_id

Теперь, перед добавлением пользователя, я хочу исправить сущность пользователя со всеми настройками и первым значением_установки для каждой настройки. Так что теперь у users_settings есть все настройки, связанные с пользователем с первым значением. Но я не могу заставить патч или newEntity работать. Все модели выпекаются, так что это должно быть хорошо. Вот мой код

$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 юридическое лицо. Как вы можете видеть, ничто не правильно написано:

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

Может кто-нибудь дать мне совет по этому поводу. Спасибо

0

Решение

Это не так 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'
]
]);

Смотрите также

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector