【问题标题】:How to write Laravel GroupBy Query?如何编写 Laravel GroupBy 查询?
【发布时间】:2020-06-16 11:49:16
【问题描述】:

我在 laravel 中尝试过,但没有成功。

$doctor_daily=ReportDoctorCompanyDailyTestModal::select('test_id','doctor.first_name','testing_types.testing_name',DB::raw('SUM(test_price) as num'))
                                                       ->join('testing_types','report_doctor_company_daily_test.test_id','=','testing_types.id')
                                                       ->join('doctor','doctor.id','=','report_doctor_company_daily_test.doctor_id')
                                                       ->groupBy('test_id')
                                                       ->get();

如何在 Laravel 5.7 中编写这个 MySQL 查询?

SELECT
    report_doctor_company_daily_test.test_id,
    testing_types.testing_name,
    doctor.first_name,
    doctor.last_name,
    SUM( report_doctor_company_daily_test.test_price ) 
FROM
    testing_types
    INNER JOIN report_doctor_company_daily_test ON testing_types.id = report_doctor_company_daily_test.test_id
    INNER JOIN doctor ON report_doctor_company_daily_test.doctor_id = doctor.id 
GROUP BY
    testing_types.id

在 sql 中,此查询有效。我如何使用它来 laravel

【问题讨论】:

标签: php mysql laravel


【解决方案1】:

试试这条线:

$doctor_daily=TestingType::join('report_doctor_company_daily_test', 'testing_types.id', '=', 'report_doctor_company_daily_test.test_id')
                          ->join('doctor', 'report_doctor_company_daily_test.doctor_id', '=','doctor.id')
                          ->groupBy('testing_types.id')
                          ->select('report_doctor_company_daily_test.test_id','testing_types.testing_name','doctor.first_name','doctor.last_name',DB::raw('SUM( report_doctor_company_daily_test.test_price )')
                          ->get();

你的 mysql 版本是 5.7+,所以检查一下reference

MySQL 5.7.5 及更高版本实现了功能依赖检测。如果启用了 ONLY_FULL_GROUP_BY SQL 模式(默认情况下),MySQL 拒绝选择列表的查询

所以检查config/database.php,如果你的mysql配置strict为真,你需要禁用ONLY_FULL_GROUP_BY,添加模式如下:

'modes' => [
            //'ONLY_FULL_GROUP_BY',
            'STRICT_TRANS_TABLES',
            'NO_ZERO_IN_DATE',
            'NO_ZERO_DATE',
            'ERROR_FOR_DIVISION_BY_ZERO',
            'NO_AUTO_CREATE_USER',
            'NO_ENGINE_SUBSTITUTION'
           ],

或者您可以只对选定的列使用any_value 方法:

PS:any_value does not exist on MariaDB

->selectRaw('ANY_VALUE(report_doctor_company_daily_test.test_id),
    ANY_VALUE(testing_types.testing_name),
    ANY_VALUE(doctor.first_name),
    ANY_VALUE(doctor.last_name),
    SUM( report_doctor_company_daily_test.test_price')

【讨论】:

  • 'SQLSTATE[42000]:语法错误或访问冲突:1305 FUNCTION medi.ANY_VALUE 不存在......'
  • @ChamodWijesena 你的mysql是什么版本的?你和medi 在any_value 函数之前有吗?
  • 10.1.32-MariaDB
  • medi 是数据库名称。
  • 使用的代码如 [$doctor_daily=TestingTypeModel::join('report_doctor_company_daily_test', 'testing_types.id', '=', 'report_doctor_company_daily_test.test_id') .. ]
【解决方案2】:

转到 config/database.php 并在 'mysql' 中更改 strict:false 。现在 Group by 应该可以工作了..

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-25
    • 2016-04-01
    • 2014-12-25
    • 2017-11-28
    • 2019-07-13
    相关资源
    最近更新 更多