检查没有原始查询的两列组合

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%")
    

现在我想将termfnamelname 的组合进行比较。所以我想这样使用

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

以上是关于检查没有原始查询的两列组合的主要内容,如果未能解决你的问题,请参考以下文章

加快sql,加入两列

Access 2016 SQL:查找不同表的两列之间的最小绝对差

如何比较数据框中的两列,检查它们之前是不是存在?

如何在 SQL 中的两列之间创建检查约束?

scss 使用Enfold进行WooCommerce的两列检查

scss 使用Enfold进行WooCommerce的两列检查