Laravel whereRaw参数不起作用?

问题描述 投票:12回答:1

根据文档,这应该工作:

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

但它没有这个工作:

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

我究竟做错了什么?这是文档

$users = User::whereRaw('age > ? and votes = 100', array(25))->get();
laravel-4
1个回答
25
投票

没有必要在“?”周围加上引号占位符。试一试:

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

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

对于那些想知道为什么在占位符周围添加引号是错误的,以及为什么不能使用占位符表示列名或列名的原因:对于预处理语句中的占位符如何工作存在一种常见的误解:它们不是简单地替换为(转义) )字符串,以及生成的SQL。相反,DBMS要求“准备”一个语句会提供一个完整的查询计划,以确定它将如何执行该查询,包括它将使用哪些表和索引,无论您如何填充占位符,这些表和索引都是相同的。

“SELECT name FROM my_table WHERE id =:value”的计划将与“:”替代相同,但是看似相似的“SELECT name FROM:table WHERE id =:value”无法计划,因为DBMS不知道你实际上要从哪个表中选择。

即使使用“模拟准备”,PDO也不能让你在任何地方使用占位符,因为它必须解决你的意思:“选择:foo来自some_table”意味着“:foo”将成为列引用,或者文字串?

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


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

© www.soinside.com 2019 - 2024. All rights reserved.