LaravelEloquentgroupBy ()和也返回每个组的计数

我有一个表,其中包含一列浏览器版本。我只是想从记录集中知道,每种类型的浏览器有多少种。所以,我需要这样的东西: 总记录: 10,Internet Explorer 8:2,Chrome 25:4,Firefox 20:4。(加起来是10)

这是我的两便士:

$user_info = Usermeta::groupBy('browser')->get();

当然,只包含3个浏览器,而不是每个浏览器的数量。我该怎么做呢?

541898 次浏览

这对我很有效:

$user_info = DB::table('usermetas')
->select('browser', DB::raw('count(*) as total'))
->groupBy('browser')
->get();

谢谢,安东尼奥,

我刚刚在末尾添加了 lists命令,所以它只返回一个带有 key 和 count 的数组:

幼虫4号

$user_info = DB::table('usermetas')
->select('browser', DB::raw('count(*) as total'))
->groupBy('browser')
->lists('total','browser');

Laravel 5.1

$user_info = DB::table('usermetas')
->select('browser', DB::raw('count(*) as total'))
->groupBy('browser')
->lists('total','browser')->all();

Laravel 5.2 +

$user_info = DB::table('usermetas')
->select('browser', DB::raw('count(*) as total'))
->groupBy('browser')
->pluck('total','browser');

这样也行,干净一点。 getQuery()只返回基础生成器,它已经包含了表引用。

$browser_total_raw = DB::raw('count(*) as total');
$user_info = Usermeta::getQuery()
->select('browser', $browser_total_raw)
->groupBy('browser')
->pluck('total','browser');

这对我有用(Laravel 5.1) :

$user_info = Usermeta::groupBy('browser')->select('browser', DB::raw('count(*) as total'))->get();

试试这个

->groupBy('state_id','locality')
->havingRaw('count > 1 ')
->having('items.name','LIKE',"%$keyword%")
->orHavingRaw('brand LIKE ?',array("%$keyword%"))

这里有一种更加 Laravel 的方法来处理 group by,而不需要使用原始语句。

$sources = $sources->where('age','>', 31)->groupBy('age');


$output = null;
foreach($sources as $key => $source) {
foreach($source as $item) {
//get each item in the group
}
$output[$key] = $source->count();
}

如果你想得到集合,groupBy 和 count:

$collection = ModelName::groupBy('group_id')
->selectRaw('count(*) as total, group_id')
->get();

干杯!

  1. 打开 config/database.php
  2. mysql连接设置中查找 strict
  3. 将值设置为 false
$post = Post::select(DB::raw('count(*) as user_count, category_id'))
->groupBy('category_id')
->get();

这是一个按职位类别计算结果的例子。

如果你想得到排序的数据也使用这个

$category_id = Post::orderBy('count', 'desc')
->select(DB::raw('category_id,count(*) as count'))
->groupBy('category_id')
->get();

Laravel 版本8

删除了数据库的依赖项

     $counts = Model::whereIn('agent_id', $agents)
->orderBy('total', 'asc')
->selectRaw('agent_id, count(*) as total')
->groupBy('agent_id')
->pluck('total','agent_id')->all();

在 Laravel8中,您可以使用 countBy()来获得一个组的总计数。

检查相同的文档。 Https://laravel.com/docs/8.x/collections#method-countby

简单的解决方案(使用 Laravel9和 Spatie/许可测试)。

总监:

//Get permissions group by guard name(3 in my case: web, admin and api)
$permissions = Permission::get()->groupBy('guard_name');

观看内容:

@foreach($permissions as $guard => $perm)
<div class="form-group">
<label for="permission">Permissions (\{\{ ucfirst($guard) }}) \{\{ count($perm) }}</label>
<select name="permission[]" id="permission" class="form-control @error('permission') is-invalid @enderror" multiple>
@foreach($perm as $value)
<option value="\{\{ $value->id }}">\{\{ $value->name }}</option>
@endforeach
</select>
@error('permission')
<div class="invalid-feedback">
\{\{ $message }}
</div>
@enderror
</div>
@endforeach

另一种方式是:


$data = Usermeta::orderBy('browser')->selectRaw('browser, count(*) as total')->get()


因为这是我搜索 eloquent count with groupby returns only first的最高结果

使用 "illuminate/database": "^9.38"在作曲家。所以“应该”是最新的在这个帖子的时间

我真的不知道为什么他们认为归还第一张唱片是正确的选择

恕我直言,当前的实现对于包括 groupBy 语句在内的查询没有意义。 为什么 N _ 1应该是“正确”的结果?

既然@taylorotwell 正确地指出了计算子查询结果的一些性能问题,为什么我们不在 php 端修复这个问题,检查是否有任何组语句,如果有,执行 N _ 1 + N _ 2 + ... . + N _ M?

Https://github.com/laravel/ideas/issues/1693#issuecomment-621167890


包装查询并执行计数似乎对我有用

$records = ...


$record_count = DB::table( "fake" );
$record_count->fromSub($records->select(DB::raw(1)),"query");
$record_count->count();
  • 创建一个“假的”查询构建器
  • 从(...)查询中添加一个子“ from”将“ sub query”设置为选择1,而不是返回巨大的列数据。我不确定是否需要这样做,但在我看来,这似乎是个好主意
  • 执行 Normal-> count ()

返回执行后的“预期”结果:

select count(*) as aggregate from (select 1 from ... group by ...) as `query`

子查询是 $records通常执行的“查询”


我的用例是分页(不使用 laravel)。所以我得到的记录计数,然后传递给分页器,然后调用 ->forPage()->get()

Https://github.com/laravel/framework/issues/44081#issuecomment-1301816710