如何在Laravel中定义多对多关系,其中枢纽分析表也具有多对多关系

时间:2019-06-03 20:29:44

标签: laravel

我有一个包含四个基本表的数据库:教室,部门,科目和日。一间教室仅在特定日期开放,并且一天中可以提供多个教室。因此,与AvailableHour表(和模型)作为数据透视表存在许多关系。该表有两个额外的字段:可用(真/假)和容量(因为一天的容量可能与基本容量不同)。 使事情复杂化的是第二对多关系。如果教室一天有空,则只能允许某些部门使用全部科目,但不包括一个科目或排除一个科目。这是第二对多的关系。部门可以是许多availableHours的一部分,而availableHour可以具有许多部门。 请参阅随附的图像。database tables with relations

如何在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,其单个元素是“天”的集合。

1 个答案:

答案 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')`