Laravel-如何在whereHas子句中访问属性?

时间:2018-09-17 21:52:35

标签: php database laravel eloquent

我的实体就像:

  • RequesterType
  • 协议
  • 流量
  • 文档
  • DocumenType

关系就像:

  • 协议属于请求者类型。
  • 协议有很多流程。
  • Flow有很多文档。
  • 文档属于文档类型。
  • 文档类型属于请求者类型。

我需要的查询:

选择所有在第一个流程(假设序列= 1)中具有 Documents 的所有 Protocols ,其中所有必需的 Document 作为他的请求者类型(实际上存储在协议中)。

  

例如,假设我有一个请求者类型为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 :(得分:0)

似乎您正在尝试使->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');
});