Laravel使用orderByRaw按列值排序时触发SQL语法错误
解决排序语法错误的问题
嘿,我一眼就发现你遇到的问题根源了——你的MySQL IF() 函数写法不符合语法规范,还有一处字符串没加引号,这才触发了SQL语法错误!
错误原因拆解
- MySQL
IF()函数参数缺失:MySQL的IF()函数需要三个参数,格式是IF(条件, 条件成立时的值, 条件不成立时的值),你只写了判断条件,漏掉了后两个必填参数,导致SQL解析失败。 - 字符串未加引号:第二个排序规则里的
manually是字符串值,你没给它加单引号,MySQL会把它当成列名来解析,这也是语法错误的诱因之一。
修正后的代码
$users = Comment::select([ 'id', 'comment', 'user_name', 'product_id', 'rating', 'country', 'status', 'pin', 'created_at', ]) ->where('shop_name', $shop) ->where('product_id', $id) ->with('images') // 修正IF函数语法:满足条件返回1,不满足返回0,DESC把符合的排前面 ->orderByRaw("IF(product_url = 'customer', 1, 0) DESC") // 给manually加单引号,直接比较的话MySQL会把布尔值转成1/0实现排序 ->orderByRaw("product_url = 'manually' DESC") ->orderBy('pin', 'desc') ->orderBy('rating', 'desc') ->with('pages') ->get();
额外提醒
从你给出的错误SQL里还看到shop_name = and product_id =,这说明变量$shop和$id可能是空值,后续可能会触发新的查询错误,记得检查这两个变量是否正确赋值哦!
内容的提问来源于stack exchange,提问作者areviews app
相关产品推荐
相关产品推荐

