user_id
,email
,phone
などを含むapplications
テーブルがあります。登録はオプションであるため、ユーザーアカウントを作成することもできないこともあります。したがって、user_id
はNULL可能です。同じメールアドレスで複数回適用することもできます。この場合、のapplications
テーブルは複数のレコードにまたがって複製されます。異なる列の値を持つモデルオブジェクトを取得する
ここでは、重複を除いてすべてのApplication
モデルインスタンスをフェッチすることを目的としています。 EX:[email protected]
でJackが5回適用した場合、applications
テーブルにはemail
カラムが5つのレコードがあり、[email protected]
に設定されています。 Application
をフェッチするときは、[email protected]
というレコードを1つだけ取得したいと考えています。他の4つは無視してください。
だから、私は複数のアプローチを試してみましたが、それらのいずれかは、すべてのレコードをフェッチしたり、まったく実行されなかった。
Illuminate\Database\QueryException with message 'SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'applications.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
groupBy('email')
があるため非aggreagated列email
のget()
で失敗します同時に、
groupBy('email')->get(['email'])
はうまく動作しますが、問題は他の列も必要です(created_at
少なくとも)、ideアライ - 完全Application
モデルインスタンス。Application::whereIn('id', function($query) { $query->select('id')->groupBy('email'); })->get()
Column not found: 1054 Unknown column 'DISTINCT email' in 'field list'
で
Application::select('*', 'DISTINCT email')->get()
結果が雄弁アプローチApplication::distinct()->get(['email'])
は、電子メールの適切なリストをテーブルから戻ってすべてのレコードを与えるが、再び、私はちょうどそれ以上の列を必要としますEメール。一度列を選択すると、結果としてすべてのレコードが取得されます。は、次のクエリは、strictモードが有効にされることに起因する故障のすべて:
SELECT * FROM ( SELECT * FROM applications ORDER BY id DESC) AS tmp GROUP BY email
SELECT * FROM applications WHERE id IN(SELECT id FROM applications GROUP BY email)
SELECT email, id, created_at from (SELECT email, id, created_at FROM applications) apps group by email
誰もが把握するために私を助けることができます適切なアプローチ? Eloquentを使って私の問題や制限に対応できるのであれば、stdObj
などではなく、実際のモデルでEloquentを使って作業したいと思います。
P.S.私が使用しているSQLエンジンはです。厳密なモードが有効なMySQLです。