Eloquent select 聚合后的字段
Eloquent select field after aggregation
我有三个模型,User
、Post
和 Comment
。 User
和Post
是一对多的关系,User
和Comment
也是一对多的关系。对于此示例,不存在 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'])
,但结果根本没有改变。
我也试过用 select(...)->get()
替换 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,
]
...
]
正确的处理方式是什么?
是的,您肯定使用上述方法过滤收集数据。您还可以使用集合的 forget() 的另一种方法,它使用键从集合中删除值。
有关更多信息,请参阅下文 link
以下代码可能适合您的需要:
class User extends Model
{
protected $hidden = ['created_at', 'updated_at'];
}
我有三个模型,User
、Post
和 Comment
。 User
和Post
是一对多的关系,User
和Comment
也是一对多的关系。对于此示例,不存在 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'])
,但结果根本没有改变。
我也试过用 select(...)->get()
替换 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,
]
...
]
正确的处理方式是什么?
是的,您肯定使用上述方法过滤收集数据。您还可以使用集合的 forget() 的另一种方法,它使用键从集合中删除值。
有关更多信息,请参阅下文 link
以下代码可能适合您的需要:
class User extends Model
{
protected $hidden = ['created_at', 'updated_at'];
}