【问题标题】:Laravel : How group by with select two column have deferent valuesLaravel:如何通过选择两列进行分组具有不同的值
【发布时间】:2021-12-01 09:18:23
【问题描述】:

我想按名称按表分组并选择名称和日期,对于具有相同值的名称具有不同的日期值,我尝试了这个但不起作用:

public function period(Request $req)
    {
        $absences = Absence::whereBetween('date', [$req->from, $req->to])->get();
        $daily = $absences->select('name ','date', 'COUNT(date) as counts');
        $arr['absences'] = $absences;
        $arr['daily'] = $daily;
        $arr['from'] = $req->from;
        $arr['to'] = $req->to;
        
        return $arr;
        return view('period',$arr,);
    }

我收到错误:Method Illuminate\Database\Eloquent\Collection::select does not exist.

当我使用这个时:

public function period(Request $req)
    {
        $absences = Absence::selectraw('name , date')->whereBetween('date', [$req->from, $req->to])->groupBy('name')->get();
        $arr['absences'] = $absences;
        $arr['from'] = $req->from;
        $arr['to'] = $req->to;
        
        //return $arr;
        return view('period',$arr,);
    }

我明白了:

SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“absences.absences.date”;这与 sql_mode=only_full_group_by 不兼容(SQL: select name , date from absences where date between 2021-10-02 and 2021-10-12 group by name

【问题讨论】:

    标签: laravel select group-by


    【解决方案1】:

    你可以试试这个吗?我认为问题在于您忘记按所选(非聚合)列进行分组。

    $daily = Absence::query()
        ->select('name', 'date')
        ->selectRaw('count(date) as counts')
        ->whereBetween('date', [$req->from, $req->to])
        ->groupBy('name', 'date')
        ->get();
    
    dd($daily);
    

    【讨论】:

    • 非常感谢它的工作
    【解决方案2】:

    select 子句中的所有列也应该在 gorup by 中,这是 mysql 中的严格模式。 如果要更改它,请转到 config/database.php 并将其设置为 false:

      'mysql' => [
                'driver' => 'mysql',
                'url' => env('DATABASE_URL'),
                'host' => env('DB_HOST', '127.0.0.1'),
                'port' => env('DB_PORT', '3306'),
                'database' => env('DB_DATABASE', 'forge'),
                'username' => env('DB_USERNAME', 'forge'),
                'password' => env('DB_PASSWORD', ''),
                'unix_socket' => env('DB_SOCKET', ''),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'prefix_indexes' => true,
                'strict' => false, // instead of true
                'engine' => null,
                'options' => extension_loaded('pdo_mysql') ? array_filter([
                    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                ]) : [],
            ],
    

    【讨论】:

    • 非常感谢,但 IGP 解决方案有效
    猜你喜欢
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2022-11-29
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多