You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:08:22