Laravel,select和groupBy - DB :: raw - issue

时间:2017-10-05 09:57:41

标签: php mysql laravel

我一直试图解决这个问题,这是我的第一个问题was this,它的工作方式正如预期的那样。

问题是我无法选择比groupBy中的列更多的列,所以我找到了一个解决方案:DB::raw('created_at as created_at')

但它让我回答:

SQLSTATE[42000]: Syntax error or access violation: 1055 created_at' isn't in GROUP BY

广告,如果我添加" create_at" groupBy(DB::raw('create_at'))和"概念"对于groupBy,然后将它们分组,这是我想要避免的。

我的代码是:

@forelse($transaction->where('status', '!=', 'ok')
                      ->select('user_id', 'option_id', 'status', 'concept', DB::raw('created_at as created_at'), DB::raw('concept as concept'))
                      ->groupBy('user_id')
                      ->groupBy('option_id')
                      ->groupBy('status')
                      ->get() as $transaction)

{{$transaction->concept}}
{{$transaction->created_at}}

谢谢:)

3 个答案:

答案 0 :(得分:2)

SELECT语句中的每一列也必须在GROUP BY子句中。

在MySQL 5.7.5或更高版本中将 only_full_group_by 模式设置为false会出现异常,但假设所有行的额外列具有相同的值 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

您也可以通过使用技巧获取非分组列的MAX()或MIN()来实现此目的,但除非将它们添加到GROUP BY语句中,否则无法获取每行的实际值

答案 1 :(得分:1)

默认情况下启用Mysql严格模式。禁用严格模式,它将解决您的问题。

'mysql'

下的config / database.php中
'strict' => true,

为假。

'strict' => false,

答案 2 :(得分:-1)

好吧,多亏了@noufalcep和@Rob Fonseca Rob,我带来了这个解决方案,我认为这发生在第5.4节之后的Laravel中,其中strict设置为true。

所以我没有完全禁用它,而是这样做了:

public class Foo 
{
   public static void main(String[] args)
    { 
    int x[] = new int[5];
    for(int i=0;i<5;i++)
        x[i]=i*i;

    for(int i=0;i<5;i++)
        {
            System.out.println("Value # " + (i+1) + " = " + x[i]);
        }
    }
}

顺便说一句,MAX MIN对我不起作用,它仍然要求将它添加到groupBy中并要求一个数组

我希望这会有助于下一个。

快乐编码