Как получить доступ к атрибуту в предложении whereHas? - PullRequest
0 голосов
/ 18 сентября 2018

Мои сущности имеют вид:

  • RequesterType
  • Протокол
  • Поток
  • Документ
  • DocumenType

Отношения имеют вид:

  • Протокол принадлежит типу запрашивающего.
  • Протокол имеет много потоков.
  • Поток имеет много документов.
  • Документы принадлежат к типу документа.
  • Тип документа принадлежит к типу запрашивающего.

Мой необходимый запрос:

Выбрать все Протоколы у которого есть документы в первом потоке (скажем, с последовательностью = 1), где есть все необходимые типы документов для его типа запрашивающего лица (это на самом деле хранится в Protocol ).

Например, предположим, что у меня есть протоколы с запросчиком типа 1 и я хочу проверить, присутствуют ли все типы документов в их документах первоготечь.Чтобы узнать все необходимые типы документов, просто запросите их из типа запрашивающего протокола.

Я начал с:

$documentsTypesByRequester = DocumentType::groupBy('requester_id')
    ->get();

$protocols = Protocol::whereHas('flows', function ($flows) use ($documentsTypesByRequester) {
    return $flows->where('sequence', 1)
        ->whereHas('documents', function ($documents) use ($documentsTypesByRequester) {
            // Select all documents that has the same
            // requester id of protocol and all document types
            // are present...
            $requesterId = // How to access protocol requester id?
            $documentTypes = $documentsTypesByRequester[$requesterId];
            // ...
        });
});

Мне нужно решить эту проблему с помощью Eloquent, а не с Collection.

1 Ответ

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

Похоже, что вы пытаетесь получить двойной долг из ->whereHas(), который, я считаю, является лишь ограничением, чтобы ограничить ваш flows теми, у кого documents. Попробуйте начать с вызова ->where(), который инкапсулирует всю вашу логику сопоставления, и используйте простой ->whereHas('documents') и посмотрите, как это работает.

Так что-то вроде этого:

$documentsTypesByRequester = DocumentType::groupBy('requester_id')
->get();

$protocols = Protocol::whereHas('flows', function ($flows) use ($documentsTypesByRequester) {
    return $flows->where('sequence', 1)
        ->where('documents', function ($query) use ($documentsTypesByRequester) {
            // Put all of your logic for choosing a document here
            // ...
        })
    ->whereHas('documents');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...