В офисе много сотрудников, и сотрудник может работать во многих офисах.
// office model
public function employees()
{
return $this->belongsToMany(Model\Employee::class);
}
// employee model
public function offices()
{
return $this->belongsToMany(Model\Office::class);
}
Используя это, я могу получить отношения, и дальнейший фильтр выглядит следующим образом:
$qualified = $office->employees()->whereHas('qualifications', function ($query) {
$query->whereIn('job', ['doctor', 'dentist']);
});
Сложность заключается в том, что некоторые офисы слишком малы, чтобы иметь своих сотрудников, поэтому мы «прикрепляем» их к одному или нескольким крупным офисам и позволяем им «унаследовать» эту рабочую силу. Мы называем небольшие офисы «второстепенными», а большие офисы «крупными».
// office model
public function majors() {
return $this->belongsToMany(Model\Office::class, 'attachments', 'minor_id', 'major_id');
}
При работе с небольшим (то есть «второстепенным») офисом я должен иметь возможность получить доступ к персоналу, который они наследуют. Мне удалось сделать это следующим образом:
// office model
public function inheritedEmployees()
{
$employees = collect();
if ($this->is_major) return $employees;
foreach ($this->majors as $major) {
$employees->concat($major->employees);
}
return $employees->unique('id')->sortBy('first_name');
}
Проблема в том, что inheritedEmployees()
не возвращает Eloquent Relationship, поэтому я не могу добавить к нему дополнительные предложения.
Как я могу изменить inheritedEmployees()
, чтобы вернуть отношения?