gth*_*huo 66 builder laravel eloquent
这可能很容易,但不知道如何.
我有一个表可以具有特定非键列字段的重复值.如何使用查询生成器或Eloquent编写SQL查询,该查询将获取具有该列的不同值的行?
请注意,我不是仅提取该列,而是与其他列值一起提取,因此distinct()可能无法正常工作.所以这个问题基本上可以是如何指定我想在查询中区分的列,现在不distinct()接受任何参数?
Mar*_*łek 91
你应该用groupby.在Query Builder中,您可以这样做:
$users = DB::table('users')
->select('id','name', 'email')
->groupBy('name')
->get();
Run Code Online (Sandbox Code Playgroud)
Pat*_*ros 55
在Eloquent中你也可以像这样查询:
$users = User::select('name')->distinct()->get();
Sal*_*lar 22
在雄辩中你可以使用它
$users = User::select('name')->groupBy('name')->get()->toArray() ;
Run Code Online (Sandbox Code Playgroud)
groupBy实际上是获取不同的值,实际上groupBy会对相同的值进行分类,以便我们可以对它们使用聚合函数.但在这种情况下,我们没有聚合函数,我们只是选择将导致结果具有不同值的值
Jed*_*nch 15
如果数据库规则不允许任何选择字段位于聚合函数之外,则分组依据将不起作用。而是使用laravel 集合。
$users = DB::table('users')
->select('id','name', 'email')
->get();
foreach($users->unique('name') as $user){
//....
}
Run Code Online (Sandbox Code Playgroud)
有人指出,这对于大型集合的性能可能不是很好。我建议在集合中添加一个键。要使用的方法称为keyBy。这是简单的方法。
$users = DB::table('users')
->select('id','name', 'email')
->get()
->keyBy('name');
Run Code Online (Sandbox Code Playgroud)
keyBy 还允许您为更复杂的事情添加回调函数......
$users = DB::table('users')
->select('id','name', 'email')
->get()
->keyBy(function($user){
return $user->name . '-' . $user->id;
});
Run Code Online (Sandbox Code Playgroud)
如果您必须迭代大型集合,向它添加一个键可以解决性能问题。
rsa*_*ale 14
虽然我迟到了回答这个问题,但使用Eloquent获取不同记录的更好方法是
$user_names = User::distinct()->get(['name']);
Run Code Online (Sandbox Code Playgroud)
Rob*_*lia 12
**
**
由于您想从表中获取所有列,您可以收集所有数据,然后使用名为Unique 的Collections 函数对其进行过滤
// Get all users with unique name
User::all()->unique('name')
Run Code Online (Sandbox Code Playgroud)
或者
// Get all & latest users with unique name
User::latest()->get()->unique('name')
Run Code Online (Sandbox Code Playgroud)
有关更多信息,您可以查看Laravel 集合文档
编辑:您可能会遇到性能问题,通过使用 Unique(),您将首先从 User 表中获取所有数据,然后 Laravel 将对其进行过滤。如果您有大量用户数据,这种方式并不好。您可以使用查询构建器并调用您想要使用的每个字段,例如:
User::select('username','email','name')->distinct('name')->get();
Run Code Online (Sandbox Code Playgroud)
我发现这种方法(对我来说)工作得很好,可以生成唯一值的平面数组:
$uniqueNames = User::select('name')->distinct()->pluck('name')->toArray();
Run Code Online (Sandbox Code Playgroud)
如果您运行->toSql()此查询生成器,您将看到它生成如下查询:
select distinct `name` from `users`
Run Code Online (Sandbox Code Playgroud)
由照亮\集合库处理->pluck()(不通过 sql 查询)。
请注意,groupBy上面使用的方法不适用于postgres。
使用distinct可能是一个更好的选择-例如
$users = User::query()->distinct()->get();
如果使用query,则可以根据要求选择所有列。
$users = User::select('column1', 'column2', 'column3')->distinct()->get();检索表中不同行的所有三个库姆。您可以根据需要添加任意数量的列。