如何使用 Eager Loading 连接具有 Laravel 的 Eloquent 关系的 3 个表?

How to join 3 tables with Laravel's Eloquent relationships with Eager Loading?

所以,一个 order 有一个 foreign_key offer_id

一个 offer 有一个 foreign_key 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 但是我想得到整个项目;它的所有列,而不仅仅是 ID。

通常情况下,您会连接这两个表。 如何使用 Eloquent?

这是我的 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);
}

如果食物是指订单中的物品,那么:

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

Laravel Eager Loading

在此之下你会发现嵌套的预先加载:

To eager load nested relationships, you may use "dot" syntax. For example, let's eager load all of the book's authors and all of the author's personal contacts in one Eloquent statement:

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

对于您的情况,我们可以使用关系之间的点表示法获得嵌套。

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

@MihirBhende 和@swonder 的回答都指出了正确的方法。

确实应该是:

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

或(同样的事情):

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

但是OfferItem模型的关系应该是相反的:

报价

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

项目

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