ChatGPT解决这个技术问题 Extra ChatGPT

Laravel Eloquent groupBy() 并且还返回每个组的计数

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

这是我的两便士:

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

当然,这仅包含 3 个浏览器,而不是每个浏览器的数量。我怎样才能做到这一点?


A
Antonio Carlos Ribeiro

这对我有用:

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

高超!只需将“浏览器”添加到选择中: select('browser', ...) 并获得所需的一切。你很好,你! youtube.com/watch?v=ravi4YtUTxo
谢谢。但是为什么它在与 User::select('country', DB::raw('count(*) as total')->otherMethods() 等模型一起使用时不起作用?
+v。在控制器上使用 \DB 而不是 DB
@AmitBera 你能解释一下原因吗?
您喜欢 DB::table('usermetas')->.. 而不是 Usermeta::.. 有什么特别的原因吗?
A
Amit Bera

这对我有用(Laravel 5.1):

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

M
ManojKiran Appathurai

谢谢安东尼奥,

我刚刚在末尾添加了 lists 命令,因此它只会返回一个带有键和计数的数组:

拉拉维尔 4

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

拉拉维尔 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');

谢谢。注意:应该删除 5.1 示例中的 ->all(),因为您已经列出了结果。
list() 已弃用并重命名为 pluck() laravel.com/docs/5.2/upgrade#upgrade-5.2.0
如何在采摘后对总数进行排序并从中获取 10 个高计数
我创建了 tnx usermetas::groupBy('browser') ->selectRaw('count(*) as total, browser') ->orderBy('total','DESC') ->skip(0)->take($ number)->pluck('浏览器');
A
Adam Kozlowski

如果要获取集合、groupBy 和计数:

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

干杯!


J
Jignesh Joisar

打开 config/database.php 找到mysql连接设置里面的strict key 将值设置为false


避免原始查询的完美方法!
搞乱你未来的 sql 代码的完美方式!并且无法在不修改的情况下在标准数据库上运行它。
M
Maik Lowrey

也可以这样工作,更整洁一些。 getQuery() 只返回已经包含表引用的基础构建器。

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

J
Jasim Juwel

试试这个

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

虽然这可能会回答问题,但最好解释答案的基本部分以及 OP 代码可能存在的问题。
谢谢! havingRaw 位非常好,因为它还可以让您根据计数过滤掉您不想要的结果。当您想要进行一些“和过滤”并为每个过滤器连接时会派上用场。
T
Tony
$post = Post::select(DB::raw('count(*) as user_count, category_id'))
              ->groupBy('category_id')
              ->get();

这是一个按类别计算帖子计数的示例。


A
Alaksandar Jesus Gene

Laravel 版本 8

删除了对 DB 的依赖

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

S
Steven

另一种方法是:


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


A
Abe Nalisi

在 Laravel 8 中,您可以使用 countBy() 来获取组的总数。

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


这适用于 Collections 而不是 Eloquent 模型。从数据库中获取所有记录然后执行 groupby 将是低效的。
m
masud_moni

这是一种无需使用原始语句即可处理 group by 的更多 Laravel 方法。

$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();
}

这是内存和处理饥饿。
对我来说同样的记忆 pb
M
Maik Lowrey

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

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

R
Rubens

简单的解决方案(使用 Laravel 9 和 Spatie/Permissions 测试)。

控制器:

//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