Laravel whereRaw参数不起作用?

时间:2013-12-30 10:34:20

标签: laravel-4

根据文档,这应该有效:

return $query->whereRaw("lang =  '?'",array(App::getLocale()));

但是这不起作用:

return $query->whereRaw("lang =  '".App::getLocale()."'");

我做错了什么?这是文档

$users = User::whereRaw('age > ? and votes = 100', array(25))->get();

1 个答案:

答案 0 :(得分:25)

没有必要在"?"周围加注。占位符。试试吧:

return $query->whereRaw("lang = ?",array(App::getLocale()));

PHP documentation关于PDO(这里也应该有效):

  

有些人想知道为什么在占位符周围添加引号是错误的,以及为什么你不能使用占位符来表或列名:   关于预处理语句中的占位符如何工作存在一个常见的误解:它们不是简单地替换为(转义的)字符串,而是执行生成的SQL。相反,DBMS要求"准备"一个语句提供了一个完整的查询计划,用于说明它将如何执行该查询,包括它将使用哪些表和索引,无论你如何填写占位符,它都是相同的。

     

" SELECT name FROM my_table WHERE id =:value"无论你用什么代替":value",但看似相似的" SELECT名称FROM:表WHERE id =:value"无法规划,因为DBMS不知道您实际要从哪个表中进行选择。

     

即使使用"模拟准备",PDO也不能让你在任何地方使用占位符,因为它必须找出你的意思:"选择:foo来自some_table"意思是":foo"将是列引用,还是文字字符串?

     

当您的查询使用动态列引用时,您应该明确地列出您知道存在于表中的列,例如:使用switch语句,并在default:子句中抛出异常。


编辑:请小心,因为这个答案很老,可能已经过时了。请用Laravel的文档确认。