是否可以在单个 Eloquent 查询中生成 3 个嵌套层?

Posted

技术标签:

【中文标题】是否可以在单个 Eloquent 查询中生成 3 个嵌套层?【英文标题】:Is it possible to produce 3 nested layers in a single Eloquent query? 【发布时间】:2020-08-08 16:29:54 【问题描述】:

我正在尝试为 Vue 前端的 Ajax 响应生成 json,以表示反应系统,输出类似于您在 Facebook 中看到的输出。帖子具有反应类型(例如,爱、愤怒),并且每种反应类型都有已注册该反应的用户。

为了将大部分工作保留在控制器中,我正在寻找的输出是这样的:

[
  
    "id": 258,
    "reactions": [
      
        "type": "like",
        "count": 2,
        "names": [
          
            "user_id": 1,
            "first_name": "Drew",
          ,
          
            "user_id": 2,
            "first_name": "Kathy",
          
        ]
      ,
      
        "type": "angry",
        "count": 3,
        "names": [
          
            "user_id": 3,
            "first_name": "Bob",
          ,
          
            "user_id": 4,
            "first_name": "Fred",
          ,
          
            "user_id": 5,
            "first_name": "Anne",
          
        ]
      
    ],
  
] 

前两层我可以轻松搞定:

return Post::latest()
    ->with('user:id,first_name')
    ->with(['postReactions' => function($query) 
        $query->select(DB::table('post_reactions'))
            ->select('post_id', 'type', DB::raw('count(*) as count'))
            ->groupBy('post_id', 'type');
    ])

而且我已经能够使用第二级的详细信息而不是摘要计数来做它的各种版本。

在我的脑海中,我想在 postReactions 子查询中添加一个嵌套的“with”,类似于:

return Post::latest()
    ->with('user:id,first_name')
    ->with(['postReactions' => function($query) 
        $query->select(DB::table('post_reactions'))
            ->select('post_id', 'type', DB::raw('count(*) as count'))
            ->groupBy('post_id', 'type');
        $query->with('user:id,first_name');
    ])

这是可能的还是我需要遍历我的初始结果以添加名称详细信息?

【问题讨论】:

【参考方案1】:

有适合​​你的内置 withCount() 方法。

对于嵌套关系,如果你用点约定链接嵌套关系,它们将得到你想要的结构:

->with('reactions.names')

当然,我假设这些是您关系的实际名称。

【讨论】:

我应该说:我可以将所有数据放入输出中,包括 withCount() 但我只能在两个级别上进行,即带有这些反应的用户的反应和姓名相同。如果必须,我可以使用它,但如果我可以从一个查询中将其放入上述结构中,则在控制器或前端中都不需要迭代。

以上是关于是否可以在单个 Eloquent 查询中生成 3 个嵌套层?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 eloquent/fluent 从单个查询中更新多行?

如何准备在单个 Windows 环境中生成 .dll 和 unix .so 的构建作业?

如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

PHP算法从单个集合中生成特定大小的所有组合

Javascript - 在单个数组中生成所有元素组合(成对)

在 pyCuda 内核中生成单个随机数