[英]Laravel 5.2 hasManyThrough relationship issue
我有3张桌子:订单,代码,事件
我希望能够提取订单中的所有事件,但是有一个中间表充当数据透视表。 我一直在尝试使用hasManyThrough
和belongsToMany
(以及withPivot
),但没有任何运气。
例子:
public function events()
{
return $this->belongsToMany('events'); // tried this, fails
return $this->hasManyThrough('events', 'codes'); // tried this, fails
return $this->hasManyThrough('events', 'codes', 'event_id', 'id'); // tried this, fails
}
任何指针都很棒!
那是一个belongsToMany
设置。 首先,第一个参数是相关类的名称。 其次,由于数据透视表不遵循Laravel命名约定,因此需要在关系定义中指定数据透视表的名称:
public function events()
{
// first parameter is the name of the related class
// second parameter is pivot table name
return $this->belongsToMany(Event::class, 'codes');
}
使用此设置,您可以执行以下操作:
// get an order
$order = Order::first();
// has all the events related to an order
$events = $order->events;
有很多方法可以做到这一点。 我将展示一个您可以完成的任务。
在Order.php
模型中
public function codes(){
return $this->has('App\Http\Code');
}
在Code.php
模型中
public function orders(){
return $this->belongsTo('App\Http\Order');
}
public function events(){
return $this->hasMany('App\Http\Event');
}
在Event.php
模型中
public function codes(){
return $this->belongsTo('App\Http\Code');
}
然后在Controller中,调用它们以获取所需的数据。
您可以按照以下方式进行操作:
$orders = Order::with(['codes' => function($q){
$q->with('events');
})->get();
也许您可以嵌套的方式获取它们(不确定这一点,因为我在发布之前没有尝试过):
$orders = Order::with('codes.events')->get();
放置return $orders;
在您的控制器中查看查询。
请享用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.