首页 > 解决方案 > laravel Eloquent/QueryBuilder - 为什么变量 $prod 的值变成“?” 在 Sql 查询中?

问题描述

对不起我的英语语法,..

我想执行这个查询,但得到 0 结果,.. 我尝试签入 ->toSql() 函数,我看到值变成了?,。而不是值是“猪肉”,。为什么变成(?)问号?以及如何解决?

这是我使用模型的 laravel 查询

$items = Item::where("item_type_id", "!=", 1)
            ->where(function ($query) use ($prod){
                    $query->where("description", "like", "'%$prod%'")
                    ->orWhere("id", "'%$prod%'");
            })
            ->toSql(); 
dd($items);

结果就是这样,参数变成了“?”。

"select * from `items` where `item_type_id` != ? and (`description` like? or `id` =?)"

标签: mysqlsqllaraveleloquentlaravel-query-builder

解决方案


? 它是用于 SQL 注入的调用绑定。如果要获取绑定变量,则可以使用getBindings()方法。

检查getBindings()的更多细节

$items = Item::where("item_type_id", "!=", 1)
            ->where(function ($query) use ($prod){
                    $query->where("description", "like", "'%$prod%'")
                    ->orWhere("id", "'%$prod%'");
            });

$sqlquery = $items->toSql(); 
$bindings = $items->getBindings();

另一种替换方式价值低于。

$sql_with_bindings = str_replace_array('?', $items->getBindings(), $items->toSql());

检查最后执行的查询的另一种方法是DB::enableQueryLog().

\DB::enableQueryLog();
$items = Item::where("item_type_id", "!=", 1)
              ->where(function ($query) use ($prod){
                   $query->where("description", "like", "'%$prod%'")
                         ->orWhere("id", "'%$prod%'");
                })->get();
dd(\DB::getQueryLog());

推荐阅读