#laravel #laravel-4 #eloquent
#laravel #laravel-4 #красноречивый
Вопрос:
В моем приложении Laravel у меня есть 3 модели (рецепт, материал и сохранение).
Соотношение между «Рецептом» и «Материалом» было установлено как «Многие ко многим». Также отношение «Сохранение» относится как к «Материалу», так и к «Рецепту», поэтому оно было установлено как «Полиморфное».
Я тестировал отношения в разных вызовах, и они работают правильно. То, что я ищу здесь, — это один вызов, который извлекает все данные этих моделей. В настоящее время я использую этот вызов:
Рецепт::with(‘материалы’,’сохранения’)->first();
Но это не вернет «Сохранение» для материалов.
Каков наилучший способ получить все данные в одной переменной с наименьшим количеством запросов?
Комментарии:
1. покажите модели, это способ получить все, что вам нужно, поэтому что-то, где-то не так.
2. @deczo , как я уже сказал, модели и их связь работают нормально. Я их протестировал. Моя проблема здесь в красноречивом запросе, а не в модельном отношении.
3. Хорошо, я не заметил, что вы не извлекаете. Все, что вам нужно,
with('materials.preservations','preservations');
— загружает вложенные отношения
Ответ №1:
Благодаря ‘deczo’ вложенные отношения могут быть получены следующим образом:
с помощью(‘materials.preservations’,’сохранения’);
Ответ №2:
Я объясню все отношения в Laravel и покажу, как их все получить:
один к одному:
вы должны использовать hasOne в первой модели и belongsTo во второй модели
чтобы добавить запись в первую модель (hasOne), используйте функцию сохранения
$post->comments()->save($comment);
чтобы добавить запись ко второй модели (belongsTo), используйте функцию associate
$user->account()->associate($account); $user->save();
от одного ко многим:
вы должны использовать hasMany в первой модели и belongsTo во второй модели
чтобы добавить запись в первую таблицу (hasMany), используйте функции save или saveMany
$post->comments()->saveMany($comments);
чтобы добавить запись ко второй модели (belongsTo), используйте функцию associate
$user->account()->associate($account); $user->save();
во многих для многих:
вы должны использовать belongsToMany в первой модели и belongsToMany во второй модели
для добавления записей в сводную таблицу используйте функции attach или sync:
— обе функции принимают один идентификатор или массив идентификаторов
— разница в том, что attach проверяет, существует ли запись уже в сводной таблице, а sync — нет
в полиморфном один ко многим:
вы должны использовать morphMany в основной модели и MorphTo во всех (*** способных) моделях
чтобы добавить записи во всех других моделях, используйте save
$course->tags()->save($tag);
сводная таблица должна содержать следующие столбцы:
— идентификатор основной модели
— (***способный) идентификатор
— (***способен) Тип
в полиморфном многие ко многим:
вы должны использовать MorphByMany в основной модели и morphToMany во всех (*** способных) моделях
для добавления записей во всех других моделях используйте save или saveMany
$course->tags()->save($tag);
$course->tags()->saveMany([$tag_1, $tag_2, $tag_3]);
сводная таблица должна содержать следующие столбцы:
— идентификатор основной модели
— (***способный) идентификатор
— (***способен) Тип
в имеет много сквозных (ярлык):
вы должны использовать hasManyThrough в первой таблице и иметь нормальные отношения в двух других таблицах
это не работает для отношений ManyToMany (где есть сводная таблица)
однако для этого есть хорошее и простое решение, которое будет рассмотрено где-нибудь еще.