如何使用Laravel与Eager Loading的Eloquent关系加入3个表?

问题描述 投票:1回答:3

所以,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);
}
laravel eloquent eager-loading laravel-5.7 eloquent--relationship
3个回答
1
投票

Laravel Eager Loading

在此下方,您将找到嵌套的预先加载:

要急切加载嵌套关系,您可以使用“dot”语法。例如,让我们在一个Eloquent声明中急切地加载本书的所有作者和作者的所有个人联系人:

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

在您的情况下,我们可以使用关系之间的点表示法来获得嵌套的表达式。

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

1
投票

如果通过食物你的意思是订单中的项目,那么:

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

0
投票

来自@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);
}
© www.soinside.com 2019 - 2024. All rights reserved.