CakePHP сохранить две модели, вторая на основе первой - PullRequest
0 голосов
/ 15 декабря 2010

У меня есть следующая ассоциация:

Группа имеет пользователя AndBelongsToMany с таблицей присоединения к groups_users.

Когда я создаю новую группу, я хочу добавить в таблицу объединения основателя группы.

Мой массив данных $ this-> выглядит следующим образом:

Array
     (
[Group] => Array
    (
        [name] => seyufgsduifsj
        [access] => 2
        [founder_id] => 3
        [random_key] => I6XC7uMTelpTSdq8DbtLPjqubiF7s6Pn
    )

[GroupsUser] => Array
    (
        [user_id] => 3
        [group_role_id] => 1
        [random_key] => PZsDZXcoCTHw1IuvqsfURVpPX6AcZ3r2
    )

)

Я попытался с помощью save () и saveAll (), но он добавил бы только группу в таблицу групп, а не ассоциацию группы пользователей.

Итак, в основном, у меня есть форма добавления, где пользователь заполняет имя группы и доступ. Затем, если данные проверяются, я добавляю еще пару значений полей в массив групп (например, random_key) и в массив объединяемой таблицы (например, user_id и group_role_id). Я хочу, чтобы Cake сначала сохранил группу, взял ее идентификатор, обновил массив таблицы соединений с соответствующим group_id, а затем сохранил и этот второй массив.

Возможно ли это прямым способом или мне нужно написать два последовательных метода save () для второго, предоставляющего последний вставленный идентификатор в первом?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 16 декабря 2010

Вы можете использовать функцию saveAll (), но вам нужно изменить формат массива GroupsUser. Согласно документации saveAll () ваши данные должны выглядеть следующим образом:

Array
     (
[Group] => Array
    (
        [name] => seyufgsduifsj
        [access] => 2
        [founder_id] => 3
        [random_key] => I6XC7uMTelpTSdq8DbtLPjqubiF7s6Pn
    )

[GroupsUser] => Array
    (
        [0] => Array
            (
               [user_id] => 3
               [group_role_id] => 1
               [random_key] => PZsDZXcoCTHw1IuvqsfURVpPX6AcZ3r2
            )
    )
)

Ваш пример будет работать, если отношение Группа принадлежит к группам пользователей , но я считаю, что это не ваш случай

0 голосов
/ 17 декабря 2010

Возможно, соответствующие модели не проходят проверку. Используйте следующий фрагмент кода для сохранения , только если все модели проверяют :

$this->Group->saveAll($this->data, array('validate' => 'only'));

Если в этот раз вы не обнаружите, что ваша группа сохраняется, то, скорее всего, в вашей модели присоединения правила не выполняются. Я предполагаю, что у вас есть notEmpty проверка для group_id, которую вы должны удалить, чтобы saveAll () заработало.

Надеюсь, это направит вас к решению вашей проблемы.


РЕДАКТИРОВАТЬ: Ваши ассоциации немного не в себе. Вот что должно быть:

Group hasMany GroupsUser
User hasMany GroupsUser
GroupRole hasMany GroupsUser
GroupsUser belongsTo Group
GroupsUser belongsTo User
GroupsUser belongsTo GroupRole

Удалить hasAndBelongsToMany связь между группами и пользователем. Его больше не существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...