Как объединить 3 таблицы с отношениями Laravel Eloquent с Eager Loading? - PullRequest
0 голосов
/ 15 февраля 2019

Таким образом, у order есть ключ извне offer_id.

И у offer есть ключ иностранца item_id.

Элемент может быть в нескольких предложениях.Но у каждого предложения есть один пункт.

Предложение может быть в нескольких заказах.Но у каждого заказа есть одно предложение.

Когда я делаю это:

$orders = Auth::user()->orders()
            ->with('offer')
            ->get();

Я получаю это:

id: 3,
user_id: 1,
offer_id: 5,
created_at: "2019-02-15 00:40:31",
updated_at: "2019-02-15 00:40:31",
offer: {
    id: 5,
    item_id: 3,
    created_at: "2019-02-15 00:39:40",
    updated_at: "2019-02-15 00:39:40"
}

Как видите, я могу получить это заэто предложение item_id: 3 но я хочу получить весь предмет;все его столбцы, а не только идентификатор.

Обычно вы объединяете эти две таблицы.Как это сделать с Eloquent?

Вот мои красноречивые отношения:

Заказ

public function offer()
{
    return $this->belongsTo(Offer::class);
}

Предложение

public function orders()
{
    return $this->hasMany(Order::class);
}

public function item()
{
    return $this->hasOne(Item::class);
}

Элемент

public function offers()
{
    return $this->belongsToMany(Offer::class);
}

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Laravel Eager Loading

Ниже вы найдете вложенную нетерпеливую загрузку:

Чтобы загружать вложенные отношения, вы можете использовать синтаксис "точка".Например, давайте постараемся загрузить всех авторов книги и все личные контакты автора в одно высказывание Eloquent:

$books = App\Book::with('author.contacts')->get();

В вашем случае мы можем получить вложенныеиспользуя точечную запись между отношениями.

$orders = Auth::user()->orders()
            ->with(['offer', 'offer.item'])
            ->get();
0 голосов
/ 15 февраля 2019

Ответы @MihirBhende и @swonder указали правильно.

Это действительно должно быть:

$orders = Auth::user()->orders()
            ->with('venue')
            ->with('offer.item')
            ->get();

или (то же самое):

$orders = Auth::user()->orders()
            ->with(['venue', 'offer.food'])
            ->get();

Но отношения моделей Offer и Item должны быть обратными:

Предложение

public function item()
{
    return $this->belongsTo(Item::class);
}

Позиция

public function offers()
{
    return $this->hasMany(Offer::class);
}
0 голосов
/ 15 февраля 2019

Если под едой вы имеете в виду предметы в заказе, как насчет:

$orders = Auth::user()->orders()
            ->with('offer', 'offer.orders', 'offer.item')
            ->get();
...