У меня есть пять таблиц: запросчики , типы документов , протоколы , потоки и документы .
Отношения
- Запрашивающая сторона имеет много типов документов .
- Запрашивающая сторона имеет много протоколов .
- Протокол имеет много потоков .
- Поток имеет много документов .
- Тип документа имеет много документов .
Проблема
Выберите все протоколы , которые имеют первый поток (скажем, последовательность = 1) с документами наличие всех типов документов для протокола запрашивающая сторона .
Другими словами, выберите протоколы, которые не имеют ограничений, это означает, что протоколы с документами внутри первого потока имеют всетребуемые типы документов для запрашивающего протокола.
Решение
В итоге я нашел решение, которое на самом деле не работает, потому что я не могу получить доступ к requestter_id значение в протоколах whereHas
Закрытие:
// All document types id's group by requester id's.
$documentTypesByRequester = DocumentType::all()
->groupBy('requester_id')
->map(function ($documentTypes, $requesterId) {
return $documentTypes->pluck('id')
->toArray();
})->toArray();
// Defined statically to reduce the complexity of question.
// $documentTypesByRequester = [
// 1 => [1, 2, 3],
// 2 => [4, 5]
// ];
// Here I have to select all protocols that have flows with
// documents having all document types of protocol requester.
$protocols = Protocol::whereHas('flows', function ($flows) use ($documentTypesByRequester) {
//
// *---------------------------------------
// * THIS DOESN'T WORK BUT IS WHAT I NEED!
// *---------------------------------------
//
// Access the requester id for current protocol.
$requesterId = $flows->first()
->protocol
->requester_id;
$documentTypesId = $documentTypesByRequester[$requesterId];
return $flows->where('sequence', 1)
->whereHas('documents', function ($documents) use ($documentTypesId) {
return $documents->whereIn('document_type_id', $documentTypesId);
}, '=', count($documentTypesId));
})->get();
Существует некоторый способ доступа к значениям модели внутри этого whereHas
Закрытия или существует другая альтернативаIve, чтобы помочь мне решить этот вопрос?