これは非常に簡単かもしれませんが、方法がわかりません。
特定の非キー列フィールドに繰り返し値を持つことができるテーブルがあります。 Query BuilderまたはEloquentを使用して、その列の個別の値を持つ行をフェッチするSQLクエリを作成するにはどうすればよいですか?
私はその列だけをフェッチしているわけではなく、他の列の値と組み合わせているため、distinct()
は実際には機能しない可能性があることに注意してください。 distinct()
はパラメーターを受け入れないので、その質問は基本的に、クエリで区別したい列を指定する方法になりますか?
groupby
を使用する必要があります。クエリビルダでは、次の方法で実行できます。
$users = DB::table('users')
->select('id','name', 'email')
->groupBy('name')
->get();
Eloquentでは、次のようにクエリすることもできます。
$users = User::select('name')->distinct()->get();
雄弁にこれを使用できます
$users = User::select('name')->groupBy('name')->get()->toArray() ;
groupByは実際に個別の値を取得しています。実際、groupByは同じ値を分類するため、それらに対して集計関数を使用できます。ただし、このシナリオでは集計関数はありません。結果に異なる値を持たせる値を選択するだけです
私はこれに答えるのが遅れていますが、Eloquentを使用して明確なレコードを取得するためのより良いアプローチは
$user_names = User::distinct()->get(['name']);
上記で使用したgroupBy
はpostgresでは機能しないことに注意してください。
おそらくdistinct
を使用する方が良いオプションです。 $users = User::query()->distinct()->get();
query
を使用する場合、要求に応じてすべての列を選択できます。
データベースルールで集計フィールドの外側に選択フィールドを許可しない場合、グループ化は機能しません。代わりに laravel collections を使用してください。
$users = DB::table('users')
->select('id','name', 'email')
->get();
foreach($users->unique('name') as $user){
//....
}
$users = User::select('column1', 'column2', 'column3')->distinct()->get();
は、テーブル内の異なる行の3つの列すべてを取得します。必要な数の列を追加できます。
$users = Users::all()->unique('name');