如何将3个表与Laravel的雄辩关系以及Eager Loading结合起来?

时间:2019-02-15 01:09:45

标签: laravel eloquent eager-loading laravel-5.7 eloquent--relationship

因此,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 但是我想得到整个物品。它的所有列,而不仅仅是ID。

通常,您将联接这两个表。 如何使用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 :(得分:1)

如果按食物来表示订单中的物品,那么:

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

答案 1 :(得分:1)

Laravel Eager Loading

在此之下,您会发现嵌套的渴望加载:

  

要急于加载嵌套关系,可以使用“点”语法。例如,让我们急切地在一项雄辩的陈述中加载本书的所有作者和作者的所有个人联系人:

     

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

在您的情况下,我们可以使用关系之间的点符号来嵌套它们。

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

答案 2 :(得分:0)

@MihirBhende和@swonder的答案都以正确的方式指出。

它确实应该是:

function(*args, **kwargs)

或(同一件事):

$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);
}