Laravel - Eloquent - 多个表连接

时间:2017-12-15 12:01:59

标签: laravel eloquent relationship

我正在开发一个培训网站,我正在努力想出正确的数据库架构。

我正在努力实现

预订 - >日期 - >代表 - >反馈

我的主要问题是,在查询数据库进行预订时,代表会链接到日期而不是预订,因此会显示所有代表。

表1 - 预订

  • id int(11)NOT NULL,

表2 - booking_date

  • date_id int(11)NOT NULL
  • booking_id int(11)NOT NULL

表3 - 日期

  • id int(11)NOT NULL,

表4 - date_delegates

  • booking_id int(11)NOT NULL
  • delegate_id int(11)NOT NULL
  • date_id int(11)NOT NULL

表5代表

  • id int(11)NOT NULL
  • booking_id int(11)NOT NULL

这些表在日期模型中加入

  • $这 - > belongsToMany('应用软件\模型\预订&#39)
  • $这 - >的hasMany('应用软件\模型\代表&#39)

    $bookings = $this->bookings
                    ->where('user_id','=',Auth::user()->id)
                    ->with('user','address','dates','dates.course','dates.days','dates.delegates','dates.delegates.feedback')
                    ->orderby('created_at','desc')
                    ->get()
                    ->toArray();
    

我尝试过hasManyThrough,但它没有给出级联我正在寻找 感谢

1 个答案:

答案 0 :(得分:0)

您必须设置关系。

预订模式:

public function dates()
{
    return $this->belongsToMany('App\Models\Date', 'booking_date');
}

日期模型:

public function delegates()
{
    return $this->belongsToMany('App\Models\Delegate', 'date_delegates');
}

您没有发布反馈的定义方式,但是,考虑到delegate_id模型中有Feedback属性,您必须在委托模型中设置此关系:

public function feedbacks()
{
    return $this->hasMany('App\Models\Feedback');
}

然后你可以在查询中调用它们。要过滤代表中的booking_id,您可以使用whereHas功能。考虑到$bId有一个booking_id。例如:

$bookings = $this->bookings
                ->where('user_id','=',Auth::user()->id)
                ->whereHas('dates', function($q1) use ($bId) {
                    $q1->whereHas('delegates', function($q2) use ($bId) {
                        $q2->where('booking_id', $bId);
                    });
                })
                ->with('user','address','dates',
                       'dates.course','dates.days',
                       'dates.delegates','dates.delegates.feedback')
                ->orderby('created_at','desc')
                ->get()
                ->toArray();

由于没有关于useraddresscoursedays的信息,我不知道如何设置他们的关系,但这个想法是同样的。