检查没有原始查询的两列组合
Posted
技术标签:
【中文标题】检查没有原始查询的两列组合【英文标题】:Check two column combination without raw queries 【发布时间】:2016-04-09 00:15:54 【问题描述】:我在 Laravel 中有这样的代码
if (!empty($filter['term']))
$term = $filter['term'];
$query->where('fname', 'ilike', "%$term%")
->orWhere('lname', 'ilike', "%$term%")
->orWhere('company', 'ilike', "%$term%")
现在我想将term
与fname
和lname
的组合进行比较。所以我想这样使用
CONCAT( fname, ' ', lname ) LIKE '%$term%'
有没有在不使用原始查询的情况下使用它?由于 SQL 注入,我想最大程度地避免原始查询。
我使用 PgSQL 作为数据库。
【问题讨论】:
【参考方案1】:您可以使用 whereRaw() 来实现 - 它允许您执行原始 SQL 代码:
$query->whereRaw("CONCAT( fname, ' ', lname ) LIKE '%?%'", array(DB::getPdo()->quote($term)))
原始代码中的问号将替换为作为第二个参数传递给 whereRaw()
的数组中的值【讨论】:
这对注入安全吗?我认为第二个参数在使用绑定时会被转义。 此外,它还向我显示另一个错误,即“无法确定 $4 的数据类型” 当原始查询与上面的查询构建器混合时,参数似乎不会被转义 - 但是通过 db::select() 或 db::statement() 运行的查询的参数会被转义。我已经更新了正确转义参数的答案。 我已经在本地运行它并且代码工作正常,你能用你现在构建的整个查询更新代码吗?该错误可能与查询的其他部分有关,或者可能是特定于 pgsql以上是关于检查没有原始查询的两列组合的主要内容,如果未能解决你的问题,请参考以下文章
Access 2016 SQL:查找不同表的两列之间的最小绝对差