У меня есть модель фильма со следующими ассоциациями (принадлежит ToMany):
Актер
Страна
Жанр
…
Когда форма публикуется, у меня есть эти данные (здесь пропущено много деталей):
‘актеры’ => массив (
«Кэри Грант»,
‘Грэйс Келли’,
…
),
‘genres’ => array (
«Драма»,
…
),
…
Я бы хотел, чтобы моя функция контроллера update () / store () легко связывала эти модели.
Актер с именем «Кэри Грант» может существовать или не существовать, а может быть, а может и не быть связан с фильмом, который я редактирую. Также я мог бы удалить его из этого фильма, поэтому мне нужно удалить связь. То же самое с жанром и всем остальным.
Поэтому я решил сделать BaseModel и сделать все это только один раз, вот так:
1. получить определенные ассоциации модели фильма.
2. проверьте, содержат ли данные POST эти ассоциации.
3. для каждого из них проверьте, существуют ли они (если не создают их) и верните массив идентификаторов. столбец, который я проверяю, это «имя», но его можно настроить.
4. синхронизировать () эти идентификаторы.
На данный момент мне не нужно добавлять больше материала к связанной модели из формы фильма (например, дата рождения актера).
Я застрял на n.1 ($ movie-> getRelations () работает только для существующих фильмов), и в целом я не уверен, что это правильный подход. Советы?
Я столкнулся с той же проблемой, и это то, что я делаю в своем проекте:
Вместо извлечения всех определенных отношений моделей, я добавляю в белый список отношения, которые можно обновить, добавив статический член
Movie::$editableRelations = ['actors', 'genres', 'countries'];
Переберите данные постов и сопоставьте их с $editableRelations
массивы. Если данные отношения существуют, следуйте приведенным ниже шагам, в противном случае мы просто не трогаем это отношение.
Шаг 3 и шаг 4 такие же, как у вас.
используйте прямые отношения: $ модель-> актеры
http://laravel.com/docs/4.2/eloquent#relationships
Все функции sync () будут выполняться ORM, поэтому самое сложное, что вы должны сделать, это n.3. Вы должны создать diff между $ model-> актерами и $ _POST [‘актерами’] и понять, каких актеров вам нужно вставить (создать новых актеров).