2017-02-14 15 views
0

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

  1. groupBy('email')があるため非aggreagated列emailget()で失敗します

    同時に、groupBy('email')->get(['email'])はうまく動作しますが、問題は他の列も必要です(created_at少なくとも)、ideアライ - 完全Applicationモデルインスタンス。

  2. Application::whereIn('id', function($query) { $query->select('id')->groupBy('email'); })->get()

    Column not found: 1054 Unknown column 'DISTINCT email' in 'field list'

  3. Application::select('*', 'DISTINCT email')->get()結果が雄弁アプローチApplication::distinct()->get(['email'])は、電子メールの適切なリストをテーブルから戻ってすべてのレコードを与えるが、再び、私はちょうどそれ以上の列を必要としますEメール。一度列を選択すると、結果としてすべてのレコードが取得されます。

  4. は、次のクエリは、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です。

答えて

0

まず、あなたの雄弁の中に式を入れたい場合は、DB::raw('DISTINCT email')を使用する必要があります。

第二に、私はあなたがこのアプローチで行くべきだと考え:

Application::select('id', 'email', 'more_fields')->groupBy('email')->get(); 

あなたのselect()機能で、それによって、列をグループを持っている必要があります。

最終オプション:

あなただけの重複を削除するために、あなたの雄弁なクエリに->distinct()機能を使用することができます。