Laravel - Доступ к значению модели в Query Builder - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть пять таблиц: запросчики , типы документов , протоколы , потоки и документы .

Отношения

  • Запрашивающая сторона имеет много типов документов .
  • Запрашивающая сторона имеет много протоколов .
  • Протокол имеет много потоков .
  • Поток имеет много документов .
  • Тип документа имеет много документов .

Проблема

Выберите все протоколы , которые имеют первый поток (скажем, последовательность = 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, чтобы помочь мне решить этот вопрос?

1 Ответ

0 голосов
/ 19 сентября 2018

Попробуйте это:

$documentTypes = DocumentType::whereColumn('requester_id', 'protocol.requester_id');
$protocols = Protocol::whereHas('flows', function ($query) use ($documentTypes) {
    $query->where('sequence', 1)
        ->whereHas('documents', function ($query) use ($documentTypes) {
            $query->select(DB::raw('count(distinct document_type_id)'))
                ->whereIn('document_type_id', (clone $documentTypes)->select('id'));
        }, '=', DB::raw('('.(clone $documentTypes)->selectRaw('count(*)')->toSql().')'));
})->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...