MySQL 1055语法错误排查及Laravel代码问题定位求助
SQL错误排查与修复
1. 1055 GROUP BY语法错误原因
MySQL在**严格模式(ONLY_FULL_GROUP_BY)**下,要求SELECT语句中所有非聚合函数的列必须出现在GROUP BY子句中。你提供的SQL语句里:
- SELECT了
bank_accounts.id、bank_accounts.holder_name、bank_accounts.bank_name这些非聚合列 - 但GROUP BY仅指定了
revenues.account_id
虽然revenues.account_id关联bank_accounts.id,但MySQL不会自动关联推断,因此触发1055错误。另外SQL中WHERE revenues.created_by = 2重复了两次,属于冗余条件,可删除其一。
2. SQL修复方案
方案一:将所有非聚合列加入GROUP BY
SELECT `bank_accounts`.`id`, `bank_accounts`.`holder_name`, `bank_accounts`.`bank_name`, sum(amount) as total FROM `revenues` LEFT JOIN `bank_accounts` ON `revenues`.`account_id` = `bank_accounts`.`id` WHERE `revenues`.`created_by` = 2 GROUP BY `bank_accounts`.`id`, `bank_accounts`.`holder_name`, `bank_accounts`.`bank_name`
方案二:利用关联关系简化GROUP BY
由于revenues.account_id是bank_accounts.id的外键,每个account_id对应唯一的bank_accounts记录,因此可以直接GROUP BYbank_accounts.id(MySQL 5.7+支持主键作为GROUP BY的唯一标识):
SELECT `bank_accounts`.`id`, `bank_accounts`.`holder_name`, `bank_accounts`.`bank_name`, sum(amount) as total FROM `revenues` LEFT JOIN `bank_accounts` ON `revenues`.`account_id` = `bank_accounts`.`id` WHERE `revenues`.`created_by` = 2 GROUP BY `bank_accounts`.`id`
Laravel代码问题排查与修复
1. 空指针风险:$bankAccount为null时调用属性
当$request->account无效时,BankAccount::find($request->account)会返回null,后续$bankAccount->holder_name会直接触发错误。
修复方式:
先判断$bankAccount非空再访问属性:
$bankAccount = BankAccount::find($request->account); $filter['account'] = !empty($bankAccount) ? $bankAccount->holder_name . ' - ' . $bankAccount->bank_name : ''; // 先判断$bankAccount存在再执行后续逻辑 if ($bankAccount && $bankAccount->holder_name == 'Cash') { $filter['account'] = 'Cash'; }
2. 查询构造器逻辑无效:$paymentAccounts未执行查询
当$request->type == 'payment'时,仅对$paymentAccounts添加了where条件,但未执行get()也未赋值到$reportData,导致后续无法获取支付账户数据。
修复方式:
if ($request->type == 'payment') { $reportData['payments'] = $payments->get(); $reportData['paymentAccounts'] = $paymentAccounts->where('payments.created_by', '=', \Auth::user()->creatorId())->get(); }
3. 代码优化建议
$revenueAccounts的where条件可以直接链式调用到get()中,代码更简洁:
if ($request->type == 'revenue' || !isset($request->type)) { $reportData['revenues'] = $revenues->get(); $reportData['revenueAccounts'] = $revenueAccounts->where('revenues.created_by', '=', \Auth::user()->creatorId())->get(); }
- 可使用Laravel全局辅助函数
request()->type替代$request->type,简化代码。
内容的提问来源于stack exchange,提问作者Imran Niaz
相关产品推荐
相关产品推荐

