我有一个包含四个基本表的数据库:教室,部门,科目和日。一间教室仅在特定日期开放,并且一天中可以提供多个教室。因此,与AvailableHour表(和模型)作为数据透视表存在许多关系。该表有两个额外的字段:可用(真/假)和容量(因为一天的容量可能与基本容量不同)。 使事情复杂化的是第二对多关系。如果教室一天有空,则只能允许某些部门使用全部科目,但不包括一个科目或排除一个科目。这是第二对多的关系。部门可以是许多availableHours的一部分,而availableHour可以具有许多部门。 请参阅随附的图像。
如何在laravel中定义这种关系,以便可以查询指定日期允许的部门的哪些教室可用?
类似
Classroom::with(['AvailableHours'=>where(day_id=requested_day and availabel=true),'AvailableHours.AllowDepartments'where(department_id=requested_department)])->get()
(为便于阅读,缩短了联系时间)。
我从一对多关系开始,但这并没有达到预期的结果。我要求AvailableHours.AllowedDepartments
时,将它们转换为许多关系以及数据透视表和模型会导致错误。
Call to undefined relationship [AllowdDepartments] on model [App\Day].
如果我仅使用{Classroom :: with('AvailableHours')},则会返回教室的集合。属性“关系”具有数组[1]的值AvailableHours,其单个元素是“天”的集合。
答案 0 :(得分:0)
我不使用多对多关系,而是通过一对多解决了问题。 AllowedDpartments和AvailableHours表具有自己的模型 Department模型具有许多AllowedDapertments,但是AllowedDepartment仅具有一个Department。这适用于教室和“可用时间”,“天数”和“可用时间”以及最后的“可用时间”和“允许的部门”。这导致以下关系:
class Day extends Model{
protected $guarded=[];
public function availableHours(){
return $this->hasMany(AvailableHour::class);
}
}
。
class Classroom extends Model{
public function availableHours()
{
//relationship with availableHour which determines the available hours
return $this->hasMany(AvailableHour::class);
}
}
。
class AvailableHour extends Model{
//get room this hour belongs to
public function classroom() {
return $this->belongsTo(Classroom::class,'number');
}
//get the day this hour belongs to
public function day(){
return $this->belongsTo(Day::class);
}
//get all the allowedDepartments for this hour
public function allowedDepartments(){
return $this->hasMany(AllowedDepartment::class);
}
}
。
class AllowedDepartment extends Model
{
//get the availableHour this AllowedDepartment belongs to
public function availableHour(){
return $this->belongsTo(AvailableHour::class);
}
// get the department this AllowedDepartment belongs to
public function department(){
return $this->belongsTo(Department::class);
}
}
。
class Department extends Model{
//get all the allowedDepartments this Department has
public function allowedDepartments(){
return $this->hasMany(AllowedDepartment::class);
}
}
以下查询返回$department
中部门可用的教室。
$classrooms=Classroom::whereHas('AvailableHours.AllowedDepartments.Department',function(Builder $query) use ($department){
$query->where('id',$department->id);
})->get('number')`