我的实体就像:
关系就像:
我需要的查询:
选择所有在第一个流程(假设序列= 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来解决这个问题。
答案 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');
});