Модель Laravel / Eloquent со многими ко многим и ссылками на себя - PullRequest
0 голосов
/ 16 мая 2018

В офисе много сотрудников, и сотрудник может работать во многих офисах.

// 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(), чтобы вернуть отношения?

1 Ответ

0 голосов
/ 16 мая 2018

Вам не нужно на самом деле возвращать отношение, чтобы связать с ним методы; любой запрос, который не был выполнен, вернет QueryBuilder, с которым вы можете связать цепочку.

Если у вас обратные отношения minors() (выбор офисов в главном офисе), вы можете попробовать сделать это:

// In the Office model

public function inheritedEmployees() {
    return EmployeeAssignment::query()
                ->where('office_id', $this->minors()->pluck('id'));
}

Я предположил, что вы создали вспомогательный (EmployeeAssignment) класс для моделирования сводной таблицы между офисами и сотрудниками (это будет полезно для работы со сложными отношениями, такими как этот).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...