关联模型字段重复时导致出现SQL错误

浏览:190 发布日期:2018/08/06
5.0.0 - 严重 - 已处理
thinkphp版本:5.1.21
使用关联模型查询时,当关联的两个表中字段重复时,将会触发一处BUG
错误信息如下:SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'status' in where clause is ambiguous原因是两个表中存在同名字段`status`
php代码如下:$limit = $request->param('limit', 20);
        $recharge = Recharge::hasWhere('user', function ($query) use ($request) {
            $username = $request->param('username', '', 'trim');
            $mobile = $request->param('mobile', '', 'trim');
            $username != '' && $query->where('username', $username);
            $mobile !='' && $query->where('mobile', $mobile);
        })->where(function ($query) use ($request) {
            $currency = $request->param('currency', -1, 'intval');
            $status = $request->param('status', -1, 'intval');
            $startDateTime = $request->param('startDateTime', null, 'strtotime');
            $endDateTime = $request->param('endDateTime', null, 'strtotime');

            $currency != -1 && $query->where('currency_id', $currency);
            $status != -1 && $query->where('status', $status);
            $startDateTime != null && $query->where('create_time', '>=', $startDateTime);
            $endDateTime != null && $query->where('create_time', '<=', $endDateTime);
        })->paginate($limit);
查看错误的SQL语句:SELECT COUNT(*) AS tp_count
FROM 
`bc_recharge` `Recharge` 
INNER JOIN
`bc_users` `Users` ON `Recharge`.`user_id`=`Users`.`id`
WHERE ( `status` = :where_AND_status ) LIMIT 1 
临时在代码中where中将status改为Recharge.status可暂时解决此问题:$limit = $request->param('limit', 20);
        $recharge = Recharge::hasWhere('user', function ($query) use ($request) {
            $username = $request->param('username', '', 'trim');
            $mobile = $request->param('mobile', '', 'trim');
            $username != '' && $query->where('username', $username);
            $mobile !='' && $query->where('mobile', $mobile);
        })->where(function ($query) use ($request) {
            $currency = $request->param('currency', -1, 'intval');
            $status = $request->param('status', -1, 'intval');
            $startDateTime = $request->param('startDateTime', null, 'strtotime');
            $endDateTime = $request->param('endDateTime', null, 'strtotime');

            $currency != -1 && $query->where('currency_id', $currency);
            $status != -1 && $query->where('Recharge.status', $status);
            $startDateTime != null && $query->where('create_time', '>=', $startDateTime);
            $endDateTime != null && $query->where('create_time', '<=', $endDateTime);
        })->paginate($limit);
评论(
后面还有条评论,点击查看>>