Laravel / Eloquent получает все встречи из полиморфного "member_id" через таблицу встречи - PullRequest
0 голосов
/ 29 января 2019

У меня есть таблица appointments и таблица appointment_members, и мои пользователи должны иметь возможность получить коллекцию appointments, выполнив поиск с помощью "member_id", который может быть Person, Incidentили CustomerID.Таблица appointment_members имеет столбцы member_id и appointment_id, поэтому member_type (также столбец) не имеет значения.Все это настроено предыдущим разработчиком, и чего не хватает, так это отношений на моделях Eloquent.Я просто создаю простой маршрут GET, который должен возвращать любые / все встречи с этим member_id.У каждой строки есть одно назначение, поэтому, если бы я должен был передать member_id, который дал бы 10 результатов, у некоторых могли бы быть приложения, а у других нет, но в конце дня мне просто нужен набор приложений, которые связаны с этим member_id.Вот снимок экрана с таблицей appointment_members: enter image description here

Если я создам простое hasOne отношение к встречам на встречи по назначению:

public function appointments()
{
    return $this->HasOne(Appointment::class, 'id', 'appointment_id');
}

Я могуполучить коллекцию appointment_members с соответствующим appointment, но не уверен, как я сводю ее к получению appointments.Один из обходных путей, который у меня есть, - это использовать HasOne, а затем собирать / фильтровать встречи:

$appointmentMembers = AppointmentMembers::where('member_id', $request->input('memberId'))->get();
$appointments = $appointmentMembers->pluck('appointments')->filter();

Интересно, кто-нибудь может найти лучший способ сделать это.Спасибо!

1 Ответ

0 голосов
/ 29 января 2019

Возможно, я не понимаю, но, возможно, я бы выбрал самый простой подход, если тип члена не важен.

Таблица уже настроена на обработку принадлежащего объекта, или morphMany, поэтому создайте связь в классе Member (или, если у вас нет родительского класса члена, прикрепите его к каждому из типов Person, Инцидент и т. Д. Конечно, вы также можете сделать это через поли, но это простой пример, чтобы получить то, что вам нужно):

public function appointments()
{
    return $this->belongsToMany(Appointment::class)->withPivot('member_type');
} 

А затем просто запросите объект-член, для которого вам нужны встречи(наличие poly сделало бы этот шаг):

$allAppointmentsForID = $member->appointments();
$appointments = $allAppointmentsForID->wherePivot('member_type', $whateverClassThisIS);

Вышеприведенное учитывает member_type.Если это не имеет значения, вы можете просто использовать верхнюю строку.

Ваш исходный БД настроен на обработку полиморфных отношений, поэтому, если вы хотели больше, чем встреча, вы можете настроить ее также.На данный момент вам нужно добавить TYPE в запрос, чтобы охватить разные классы.

Если тип члена важен, полиморфный может выглядеть примерно так в классе Member:

public function appointments()
{
    return $this->morphMany(Appointment::class, 'memberableOrmember_typeOrWhatever');
}

Затем вы можете запросить объект-член всего одной строкой

$appointments = $member->appointments();
...