通过

2017-12-03 45 views
2

命名参数绑定的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 
    ]); 

有什么想法吗?

+0

什么不起作用?你得到什么错误? – zuif

+0

我没有收到错误消息。结果没有排序。 –

+0

你可以显示你的'$ orderBy'包含数据吗? –

回答

1

问题出在底层的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) 

如果必须使用原始表达式,你将不得不手动值消毒顺序并将其插入到查询为一个字符串。

+0

我已经尝试了第一个。那行不通。第二个工作没有错误。 - > select('product.id as product-id',...); - > orderBy($ orderColumn,$ orderDir) - > offset($ start) - > limit($ length) - > get();但为什么参数绑定不能按照完整的原始语句顺序进行? –

+0

@ThomasMüller我不确定,当你输出sql查询时你会得到什么?在查询构建器上调用'toSql()'。 –

+0

无法在完整原始语句中调用'toSql'。 –