web-dev-qa-db-ja.com

Laravelの非キー列フィールドの個別の値を取得する方法は?

これは非常に簡単かもしれませんが、方法がわかりません。

特定の非キー列フィールドに繰り返し値を持つことができるテーブルがあります。 Query BuilderまたはEloquentを使用して、その列の個別の値を持つ行をフェッチするSQLクエリを作成するにはどうすればよいですか?

私はその列だけをフェッチしているわけではなく、他の列の値と組み合わせているため、distinct()は実際には機能しない可能性があることに注意してください。 distinct()はパラメーターを受け入れないので、その質問は基本的に、クエリで区別したい列を指定する方法になりますか?

60
gthuo

groupbyを使用する必要があります。クエリビルダでは、次の方法で実行できます。

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

Eloquentでは、次のようにクエリすることもできます。

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

52
Pathros

雄弁にこれを使用できます

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

groupByは実際に個別の値を取得しています。実際、groupByは同じ値を分類するため、それらに対して集計関数を使用できます。ただし、このシナリオでは集計関数はありません。結果に異なる値を持たせる値を選択するだけです

22
Salar

私はこれに答えるのが遅れていますが、Eloquentを使用して明確なレコードを取得するためのより良いアプローチは

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

上記で使用したgroupByはpostgresでは機能しないことに注意してください。

おそらくdistinctを使用する方が良いオプションです。 $users = User::query()->distinct()->get();

queryを使用する場合、要求に応じてすべての列を選択できます。

5
jec006

データベースルールで集計フィールドの外側に選択フィールドを許可しない場合、グループ化は機能しません。代わりに laravel collections を使用してください。

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

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

$users = User::select('column1', 'column2', 'column3')->distinct()->get();は、テーブル内の異なる行の3つの列すべてを取得します。必要な数の列を追加できます。

3
Mark-Hero
$users = Users::all()->unique('name');
1
Roland Verner