laravel 如何使用动态创建的原始sql查询字符串?

dxxyhpgq  于 2023-01-21  发布在  其他
关注(0)|答案(1)|浏览(122)

我在这里看到过类似的帖子,但是它们是针对老版本的Laravel的,而且我的查询字符串是动态创建的。
我得到一个数组的数组,这些数组表示我在构造sql查询字符串时需要使用的值。例如:

[
    ["a" => "a1", "b" => "b1", "c" => "c1"],
    ["a" => "a2", "b" => "b2", "c" => "c2", "d" => "d2"]
]

然后,我需要创建一些复杂的查询,这是不可能写与Laravel的查询生成器,并使用上述动态数据:

SELECT
...
WHERE (a="a1", b="b1", c="c1")
OR WHERE (a="a2", b="b2", c="c2", d="d2")
...

从我在这里看到的旧帖子中,有人提到我可以使用

$result = DB::select($query_string):

或者甚至用DB::statement
但是,我不确定这在Laravel 8及以上是否仍然是一个好方法,因为它不在文档中。
但即使是这样,这也意味着我将按原样放置字符串,而不考虑绑定值以防止sql注入。
那么在这种情况下我该怎么做呢?

7rtdyuoh

7rtdyuoh1#

我会使用Closure和foreach,因为您可以使用带有字符串键的数组来定义where/orWhere条件。

$conditions = [
   ["a" => "a1", "b" => "b1", "c" => "c1"],
   ["a" => "a2", "b" => "b2", "c" => "c2", "d" => "d2"]
];
DB::table('your_table')->where(function($query) use ($conditions) {
       foreach($conditions as $condition) {
           $query->orWhere($condition);
       }
   })->selectRaw($query_string)->get();

如果您真的需要使用原始SQL,只需添加orderByRaw()groupByRaw等原始函数... https://laravel.com/api/9.x/Illuminate/Database/Query/Builder.html
关于sql注入,您需要验证数据。https://laravel.com/docs/9.x/validation

相关问题