如何在Laravel中获取非键列字段的不同值?

问题描述 投票:54回答:7

这可能很容易,但不知道如何。

我有一个表可以具有特定非键列字段的重复值。如何使用查询生成器或Eloquent编写SQL查询,该查询将获取具有该列的不同值的行?

请注意,我不是仅提取该列,而是与其他列值一起使用,因此distinct()可能无法正常工作。所以这个问题基本上可以是如何指定我想在查询中区分的列,因为distinct()不接受任何参数?

laravel eloquent builder
7个回答
84
投票

你应该使用groupby。在Query Builder中,您可以这样做:

$users = DB::table('users')
            ->select('id','name', 'email')
            ->groupBy('name')
            ->get();

48
投票

在Eloquent中你也可以像这样查询:

$users = User::select('name')->distinct()->get();


22
投票

在雄辩中你可以使用它

$users = User::select('name')->groupBy('name')->get()->toArray() ;

groupBy实际上是获取不同的值,实际上groupBy会对相同的值进行分类,以便我们可以对它们使用聚合函数。但在这种情况下,我们没有聚合函数,我们只是选择将导致结果具有不同值的值


11
投票

虽然我迟到了回答这个问题,但使用Eloquent获取不同记录的更好方法是

$user_names = User::distinct()->get(['name']);

5
投票

请注意,上面使用的groupBy不适用于postgres。

使用distinct可能是一个更好的选择 - 例如 $users = User::query()->distinct()->get();

如果您使用query,您可以根据要求选择所有列。


4
投票

如果数据库规则不允许任何选择字段在聚合函数之外,则分组将不起作用。而是使用laravel collections

$users = DB::table('users')
        ->select('id','name', 'email')
        ->get();

foreach($users->unique('name') as $user){
  //....
}

3
投票

qazxsw poi检索表中不同行的所有三列。您可以根据需要添加任意数量的列。

© www.soinside.com 2019 - 2024. All rights reserved.