Laravel whereRaw参数不起作用?

 金牛梁浩_934 发布于 2023-02-07 15:22

根据文档,这应该工作:

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

但它没有这个工作:

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

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

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

Cranio.. 25

没有必要在"?"周围加上引号 占位符.试一试:

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

从关于PDO的PHP文档(这也应该在这里有效):

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

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

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

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


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

1 个回答
  • 没有必要在"?"周围加上引号 占位符.试一试:

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

    从关于PDO的PHP文档(这也应该在这里有效):

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

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

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

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


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

    2023-02-07 15:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有