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

时间:2014-08-10 12:56:51

标签: laravel eloquent builder

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

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

请注意,我不是仅提取该列,而是与其他列值一起使用,因此distinct()可能无效。那么问题基本上就是如何在distinct()不接受参数的情况下指定我想在查询中区分的列?

14 个答案:

答案 0 :(得分:83)

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

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

答案 1 :(得分:47)

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

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

答案 2 :(得分:22)

在雄辩中你可以使用这个

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

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

答案 3 :(得分:11)

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

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

答案 4 :(得分:5)

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

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

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

答案 5 :(得分:4)

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

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

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

答案 6 :(得分:3)

$users = User::select('column1', 'column2', 'column3')->distinct()->get();检索表中不同行的所有三个同语。您可以根据需要添加任意数量的列。

答案 7 :(得分:1)

我发现此方法(对我而言)非常有效,可以生成唯一值的平面数组:

$uniqueNames = User::select('name')->distinct()->pluck('name')->toArray();

如果您在此查询构建器上运行->toSql(),将会看到它生成如下查询:

select distinct `name` from `users`

->pluck()由illuminate \ collection lib处理(不是通过sql查询)。

答案 8 :(得分:1)

在尝试填充用户与其他用户所拥有的所有唯一线程的列表时,我遇到了相同的问题。这对我来说很成功

Message::where('from_user', $user->id)
        ->select(['from_user', 'to_user'])
        ->selectRaw('MAX(created_at) AS last_date')
        ->groupBy(['from_user', 'to_user'])
        ->orderBy('last_date', 'DESC')
        ->get()

答案 9 :(得分:0)

$users = Users::all()->unique('name');

答案 10 :(得分:0)

**

经过Laravel 5.8测试

**

由于要从表中获取所有列,因此可以收集所有数据,然后使用名为Unique的Collections函数对其进行过滤

// Get all users with unique name
User::all()->unique('name')

// Get all & latest users with unique name 
User::latest()->get()->unique('name')

有关更多信息,您可以检查Laravel Collection Documentations

答案 11 :(得分:0)

对于那些喜欢我的人犯同样的错误。这是精心设计的答案 在Laravel 5.7中测试

A。数据库中的记录

UserFile :: orderBy('created_at','desc')-> get()-> toArray();

Array
(
    [0] => Array
        (
            [id] => 2073
            [type] => 'DL'
            [url] => 'https://i.picsum.photos/12/884/200/300.jpg'
            [created_at] => 2020-08-05 17:16:48
            [updated_at] => 2020-08-06 18:08:38
        )

    [1] => Array
        (
            [id] => 2074
            [type] => 'PROFILE'
            [url] => 'https://i.picsum.photos/13/884/200/300.jpg'
            [created_at] => 2020-08-05 17:20:06
            [updated_at] => 2020-08-06 18:08:38
        )

    [2] => Array
        (
            [id] => 2076
            [type] => 'PROFILE'
            [url] => 'https://i.picsum.photos/13/884/200/300.jpg'
            [created_at] => 2020-08-05 17:22:01
            [updated_at] => 2020-08-06 18:08:38
        )

    [3] => Array
        (
            [id] => 2086
            [type] => 'PROFILE'
            [url] => 'https://i.picsum.photos/13/884/200/300.jpg'
            [created_at] => 2020-08-05 19:22:41
            [updated_at] => 2020-08-06 18:08:38
        )
)

B。所需的分组结果

UserFile :: select('type','url','updated_at)-> distinct('type')-> get()-> toArray();

Array
(
    [0] => Array
        (
            [type] => 'DL'
            [url] => 'https://i.picsum.photos/12/884/200/300.jpg'
            [updated_at] => 2020-08-06 18:08:38 
        )

    [1] => Array
        (
            [type] => 'PROFILE'
            [url] => 'https://i.picsum.photos/13/884/200/300.jpg'
            [updated_at] => 2020-08-06 18:08:38
        )
)

因此,仅传递"select()"中那些值相同的列。 例如:'type','url'。您可以添加更多具有相同值的列,例如'updated_at'

如果您尝试通过"created_at"中的"id""select()",则将获得与A相同的记录。 因为数据库中的每一行都不同。

答案 12 :(得分:0)

// Get unique value for table 'add_new_videos' column name 'project_id'
$project_id = DB::table('add_new_videos')->distinct()->get(['project_id']);

答案 13 :(得分:-1)

$users = User::all();
foreach($users->unique('column_name') as $user){
    code here..
}