获取具有不同列值的模型对象

时间:2017-02-14 20:08:55

标签: laravel eloquent laravel-5.4

我有applications表,其中包含user_idemailphone等。申请人可能会也可能不会创建用户帐户,因为注册是可选的;因此user_id可以为空。他们也可能使用相同的电子邮件地址多次申请,在这种情况下,email表中的applications将在多个记录中重复。

现在,目标是获取除重复项之外的所有Application模型实例。 EX:如果Jack使用jack@gmail.com应用了五次,则applications表将有5条记录,email列设置为jack@gmail.com。在获取Application时,我只想获得jack@gmail.com的一条记录,其他四条记录应该被忽略。

所以,我尝试了多种方法,但他们要么取出所有记录,要么根本不执行:

    由于非焦点列groupBy('email')
  1. get()因{1}}而失败:

    email

    与此同时,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')->get(['email'])),理想情况下 - 完整的created_at模型实例。

  2. Application返回表格中的所有记录

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

    Application::select('*', 'DISTINCT email')->get()

    Eloquent方法Column not found: 1054 Unknown column 'DISTINCT email' in 'field list'提供了正确的电子邮件列表,但我再次需要更多列,只需要电子邮件。一旦我开始选择更多列,我会继续将所有记录作为结果。

  4. 由于启用了严格模式,以下所有查询均失败:

    • Application::distinct()->get(['email'])
    • 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)
  5. 任何人都可以帮我找出正确的方法吗?我很乐意使用Eloquent并使用实际模型,而不是SELECT email, id, created_at from ( SELECT email, id, created_at FROM applications) apps group by email或其他,如果Eloquent可以适应我的问题/限制。

    P.S。我正在使用的SQL引擎是 MySQL ,启用了严格模式。

1 个答案:

答案 0 :(得分:0)

首先,如果你想在你的口才中加入一个表达式,你必须使用DB::raw('DISTINCT email')

其次,我相信你应该采用这种方法:

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

您必须在select()函数中将您按其分组的列。

最后一个选项:

您可以在您的eloquent查询中使用->distinct()函数删除重复项。