Отношения Laravel и их получение

#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 (где есть сводная таблица)
однако для этого есть хорошее и простое решение, которое будет рассмотрено где-нибудь еще.