Lumen/Laravel:计算每一个嵌套关系

Lumen/Laravel: count every nested relationship

我在 Lumen 8 中有这些嵌套关系,我正在寻找一个 Eloquent 解决方案,如果可能的话,以显示每个嵌套关系的计数。

程序 ->(hasMany) 文档 ->(hasMany) 文档文件

我想计算 DocumentFiles 但在 Documents 上。 (字段 document_files_count)

所以如果我有 1 个过程和 2 个文档,每个文档有 1 个文件,我想在每个文档对象上有一个 document_files_count 计数 1.

这就像我在返回过程对象时所期望的那样:

{
    "id": 1,
    "title": "Exercitationem ea distinctio consectetur.",
    "description": "Deserunt perferendis impedit laboriosam nemo hic unde est et. Quia dolores tempora incidunt iste dolor fugiat harum quae. Ducimus sit quo ut recusandae rerum qui.",
    "expiry": "2021-05-31 04:51:15",
    "status": "hidden",
    "documents_count": 1,
    "documents": [
        {
            "id": 1,
            "procedure_id": 1,
            "title": "docname",
            "description": "Lorem ipsum ",
            "document_files_count": 1
            "document_files": [
                {
                    "id": 1,
                    "document_id": 1,
                    "path": "path_to_file",
                    "extension": null,
                    "size": 34020,
                }
            ]
        },
        {
            "id": 2,
            "procedure_id": 1,
            "title": "docname2",
            "description": "Lorem ipsum 2",
            "document_files_count": 1
            "document_files": [
                {
                    "id": 1,
                    "document_id": 1,
                    "path": "path_to_file",
                    "extension": null,
                    "size": 34020,
                }
            ]
        }
    ]
}

我还在 Procedure 模型中设置了一个 hasManyThrough 关系,以从 Procedure.. 访问文档文件数据。但是 withCount(['documentFiles']) 显然给我的是一般过程文档,而不是每个文档的文件计数。

public function documentFiles(){
    return $this->hasManyThrough(DocumentFile::class, Document::class);
}

非常感谢!!

如果你有 HasMany(或相反)关系,你可以做 NAME_OF_RELATION_count。在您的情况下,它将是 documentFiles_count,这将返回特定关系所具有的模型数量。

所以,假设你想得到每个数字,你可以这样做:

$procedures = Procedure::with('documents.documentsFiles')->all();
$eachDocumentsFiles = collect();

foreach ($procedures as $procedure) {
    foreach ($procedure->documents as $document) {
        $eachDocumentsFiles->push($document->documentFiles_count);
    }
}

请记住,这段代码不是 100% 高效的,我只是那样编码,因为我没有代码可以使用。但魔术是使用 ->relation_name_count,在你的情况下 ->documentFiles_count.

如果这不起作用,您将不得不使用 withCount(但我不确定它是否在 Lumen 中可用)。