Как определить отношения многие ко многим в laravel, где сводная таблица также имеет отношение многие ко многим - PullRequest
0 голосов
/ 03 июня 2019

У меня есть база данных с четырьмя базовыми таблицами: класс, отдел, предмет и день.Классная комната доступна только в определенные дни, и в день может быть доступно более одной классной комнаты.Так что это отношение многие ко многим с таблицей AvailableHour (и моделью) в качестве сводной таблицы.В этой таблице есть два дополнительных поля: доступное (true / false) и вместимость (поскольку вместимость за день может отличаться от базовой вместимости).Чтобы усложнить вещи, есть второе отношение многие ко многим.Если классная комната доступна в день, она может быть разрешена только для определенных отделов, либо по всем предметам, исключая один предмет или один предмет исключен.Это второе отношение многих ко многим.Отдел может быть частью многих доступных часов, а доступный час может иметь много отделов.См. Прилагаемое изображение. 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')} aКоллекция возвращается из учебных аудиторий.Свойство «Relations» имеет значение AvailableHours массива [1], единственным элементом которого является коллекция «Day».

1 Ответ

0 голосов
/ 09 июня 2019

Я решил проблему, не используя отношения многие ко многим, но используя один ко многим. Таблицы AllowedDpartments и AvailableHours получают свои собственные модели. Модель Отдела имеет много Разрешенных документов, но у Разрешенного отдела есть только один Отдел. То же самое относится к классам и доступным часам, дням и доступным часам и, наконец, доступным часам и разрешенным отделам. Это приводит к следующим отношениям:

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')`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...