【问题标题】:Eloquent select field after aggregation聚合后的雄辩选择字段
【发布时间】:2022-01-19 10:56:10
【问题描述】:

我有三个模型,UserPostCommentUserPost 处于一对多关系中,UserComment 也是如此。对于本示例,不存在Post-Comment 关系。

当我运行以下查询时

User::withCount(['posts', 'comments'])->get()

我得到了预期的结果:

[
...
  App\Models\User {#3459
    id: 18,
    username: "Foo",
    created_at: "2021-12-08 11:38:39",
    updated_at: "2021-12-08 11:38:39",
    posts_count: 5,
    comments_count: 15,
  }
...
]

我想从结果模型中删除时间戳。 我尝试将我想要的字段数组作为get 的参数(如->get(['username', 'posts_count', 'comments_count']),但结果根本没有改变。

我也尝试将get(...) 替换为select(...)->get(),但这会产生此错误:

Illuminate\Database\QueryException with message 
'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'posts_count' in 'field list'  
(SQL: select `username`, `posts_count`, `comments_count` from `users`)'

我认为这是因为聚合函数尚未执行。

所以我想出了这个解决方案

$usersWithCounts = User::withCount(['posts', 'comments'])->get()
    ->map(function ($item, $key) {
         return $item->only(['username', 'posts_count', 'comments_count']); 
      });

但感觉不对:返回的集合不再由 Eloquent 模型组成,只是简单的数组。

[
...
  [
    username: "Foo",
    posts_count: 5,
    comments_count: 15,
  ]
...
]

正确的做法是什么?

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    以下代码可能满足您的需求:

    class User extends Model
    {
        protected $hidden = ['created_at', 'updated_at'];
    }
    

    【讨论】:

    • 是的,我知道我可以使用 $hidden 属性隐藏这些字段,但如果我只想针对此查询而不是全部排除它们怎么办?
    • 你可以试试这个方法User::withCount(['posts', 'comments'])->makeHidden(['created_at', 'updated_at'])->get() 吗?
    • 不知道makeHidden 方法!像魅力一样工作,谢谢!
    【解决方案2】:

    是的,您肯定使用上述方法过滤收集数据。另一种方法是使用集合的忘记(),使用键从集合中删除值。

    更多信息请参考以下链接

    Forgot collection method

    【讨论】:

    • User::withCount(['posts', 'comments'])->get()->forget(['created_at', 'updated_at']) 不会产生我期望的结果。你能提供一个应该如何使用它的例子吗?
    • 对我来说很好用。我使用相同的语法,如 $collection->forget(['number','object']);您可以在下面的链接collection-playground.atymic.dev 上查看它
    • 您也可以使用过滤功能,例如 $users = User::withCount(['posts', 'cmets'])->get(); $results = $users->filter(function($value, $key) { return $key != 'created_at' && $key != 'updated_at'; });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多