我的laravel应用程序中有一个数据库模式。在该模式中,有三个模型 - Boss
,Employee
和Review
。
一个老板可以有很多员工。一个员工可以有很多老板(我们可以考虑以前工作的老板(。员工可以审查他/她的老板。老板不能评价任何人,所以只有员工可以评价。
因此,存在这些关系——
员工和老板有多对多关系
员工和评论有一对多的关系(一个员工可以审查多个老板,因此他/她这边有多个评论(。
如您所见,Boss
和Review
之间没有直接关系。但是,查询是 -
老板"x"的评论是什么?
为了回答这个问题,我首先认为它有"hasManyThrough"的关系。但是,"hasManyThrough"只有在老板和员工有"一对多"关系时才有效。也就是说,当一个老板可以有多个员工,但反之则不然。
所以,我的问题是 - 是否有适用于这种情况的关系(如多态等(?如果是,如何在拉拉维尔中使用它?
不需要带有评论的额外表格。
这是您所需要的一切 - 首先是表格:
bosses: id, ...
employees: id, ...
boss_employee: id, boss_id, employee_id, review (nullable), ...
然后是模型:
// Boss model
public function employees()
{
return $this->belongsToMany('Employee')->withPivot('review');
}
public function reviews()
{
return $this->hasMany('Review');
}
// Employee model
public function bosses()
{
return $this->belongsToMany('Boss')->withPivot('review');
}
public function reviews()
{
return $this->hasMany('Review');
}
// Review model
protected $table = 'boss_employee';
public function boss() // or eg. reviewed
{
return $this->belongsTo('Boss');
}
public function employee() // or eg. reviewer
{
return $this->belongsTo('Employee');
}
现在,通过此设置,您可以执行以下操作:
// get boss and his review
$boss = $employee->bosses->first();
$review = $boss->pivot->review;
// get review for given boss of an employee
$review = $employee->reviews()->where('boss_id', $bossId)->first();
// get bosses with reviews
$bosses = Boss::whereHas('reviews', function ($q) {
$q->whereNotNull('review');
})->get();
// and so on and so forth
您可以通过添加全局作用域来增强Review
模型,以便它仅返回具有not null
审阅字段boss_employee
表中的行。这与SoftDeletingScope
几乎相同,但条件需要交换 - 默认情况下whereNotNull
,而不是在SoftDeletingScope中whereNull
。