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

Posted

技术标签:

【中文标题】Lumen/Laravel:计算每个嵌套关系【英文标题】:Lumen/Laravel: count every nested relationship 【发布时间】:2021-09-03 08:13:05 【问题描述】:

我在 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);

非常感谢!!

【问题讨论】:

【参考方案1】:

如果你有一个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 中可用)。

【讨论】:

以上是关于Lumen/Laravel:计算每个嵌套关系的主要内容,如果未能解决你的问题,请参考以下文章

Lumen/Laravel Eloquent - 按数据透视表中的属性过滤

Lumen (Laravel) VS NODE.JS 解决方案

Laravel/lumen 5.2 从现有数据库生成迁移表

如何在 LUMEN 中使用 GATE 立面(Laravel 6.2)

在没有 Lumen/Laravel 会话的情况下使用 Lumen + Dingo + JWT

如何(重新)组织这些数据 - Lumen/Laravel