所以,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);
}
在此下方,您将找到嵌套的预先加载:
要急切加载嵌套关系,您可以使用“dot”语法。例如,让我们在一个Eloquent声明中急切地加载本书的所有作者和作者的所有个人联系人:
$books = App\Book::with('author.contacts')->get();
在您的情况下,我们可以使用关系之间的点表示法来获得嵌套的表达式。
$orders = Auth::user()->orders()
->with(['offer', 'offer.item'])
->get();
如果通过食物你的意思是订单中的项目,那么:
$orders = Auth::user()->orders()
->with('offer', 'offer.orders', 'offer.item')
->get();
来自@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);
}