如何使用 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();
在此之下你会发现嵌套的预先加载:
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();
但是Offer
和Item
模型的关系应该是相反的:
报价
public function item()
{
return $this->belongsTo(Item::class);
}
项目
public function offers()
{
return $this->hasMany(Offer::class);
}
所以,一个 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();
在此之下你会发现嵌套的预先加载:
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();
但是Offer
和Item
模型的关系应该是相反的:
报价
public function item()
{
return $this->belongsTo(Item::class);
}
项目
public function offers()
{
return $this->hasMany(Offer::class);
}