通过
命名参数绑定的Laravel原始SQL查询命名参数绑定“order by”在此完整原始语句上不起作用。不显示错误消息。开始和长度的工作。通过
$sql = "SELECT
product.id AS 'product-id',
product.name AS 'product-name',
product.status AS 'product-status',
product.ingredients 'product-ingredients',
product.price AS 'product-price',
category.name AS 'category-name'
FROM
product
LEFT JOIN
category ON product.category_id = category.id
ORDER BY :orderBy
LIMIT :start,:length";
return DB::select($sql, [
'orderBy' => $orderBy,
'start' => $start,
'length' => $length
]);
有什么想法吗?
问题出在底层的PDO语句中。您不能像绑定值那样在查询中绑定表名或列名。看到这个答案:
Can PHP PDO Statements accept the table or column name as parameter?
你可以重写查询,而不生表达式:
return DB::table('product')
->select([
product.id AS 'product-id',
...
])->leftJoin('category', 'product.category_id', '=', 'category.id')
->orderBy($orderBy)
->limit($start, $length)
如果必须使用原始表达式,你将不得不手动值消毒顺序并将其插入到查询为一个字符串。
我已经尝试了第一个。那行不通。第二个工作没有错误。 - > select('product.id as product-id',...); - > orderBy($ orderColumn,$ orderDir) - > offset($ start) - > limit($ length) - > get();但为什么参数绑定不能按照完整的原始语句顺序进行? –
@ThomasMüller我不确定,当你输出sql查询时你会得到什么?在查询构建器上调用'toSql()'。 –
无法在完整原始语句中调用'toSql'。 –
什么不起作用?你得到什么错误? – zuif
我没有收到错误消息。结果没有排序。 –
你可以显示你的'$ orderBy'包含数据吗? –