【问题标题】:laravel eloquent count with a groupbylaravel 雄辩计数与 groupby
【发布时间】:2017-06-06 13:17:35
【问题描述】:

如果我有下面的表结构

ID      name   type    
1       John   Admin   
2       Johan  Admin
3       Sam    User
4       Rick   User

我如何将 Laravel Eloquent 与 groupBy 查询一起使用,但仍然获取每条记录,并且还总结每种类型有多少条记录?

示例结果如下

[
    'type' => 'Admin',
    'records' => 2
    'data' => [
        0 => [
            'name' => 'John'
        ],
        1 => [
            'name' => 'Johan'
        ]
    ]
], 
[
    'type' => 'User',
    'records' => 2
    'data' => [
        0 => [
            'name' => 'Sam'
        ],
        1 => [
            'name' => 'Rick'
        ]
    ]
]

【问题讨论】:

  • 您的查询代码在哪里?
  • 你试过什么?

标签: php laravel eloquent


【解决方案1】:

由于您要查询所有用户,因此您应该在查询之后进行分组,而不是在查询中进行分组,例如:

$users = User::all()->groupBy('type');

那么你可以这样做:

foreach ($allUsers as $type => $users) {
    $type; // 'Admin'
    $users->count(); // Record Count
    foreach ($users as $user) {
        $user->name; // 
    }
}

如果您希望数据与您的示例完全一样,那么它将是:

User::all()
    ->groupBy('type')
    ->map(function($users, $type) {
        return [
            'type'    => $type,
            'records' => $users->count(),
            'data'    => $users->pluck('name')
        ];
    })
    ->values();

【讨论】:

  • 这正是我想要的。这也允许我在类型为动态时使用此查询,并且仍然将它们正确组合在一起,非常感谢
【解决方案2】:

我认为实现这一点的最佳方法是创建一个表格,其中包含通过hasMany() 与您的数据相关的类型。

然后您可以使用标准的 Eloquent 工具,而无需手动重组数据:

$data = Type::with('users')->withCount('users')->get();

【讨论】:

【解决方案3】:

另外,您可以使用DB::select('select * from xxx group by yyy') 来执行查询。

【讨论】:

  • 如果你有一个大小合适的数据库,这将是一个太重的 sql 语句而无法写下来。
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
相关资源
最近更新 更多