当前位置: 首页 > 知识库问答 >
问题:

Laravel的toSql()方法是否屏蔽id?(列值被问号取代)

谢昂雄
2023-03-14

我正在尝试调试一些SQL查询,这些查询是在测试套件中进行的。使用以下调试代码:

\Log::debug(User::first()->jobs()->toSql());

输出的SQL是:

`select * from `jobs` where `jobs`.`deleted_at` is null and `jobs`.`managed_by_id` = ? and `jobs`.`managed_by_id` is not null`

那个问号在那里做什么?我已经测试了查询,它可以按预期工作。这是因为我选择的第一个()用户,这是发生?

共有3个答案

董新觉
2023-03-14

只是为了重申@giovannipds伟大的答案...我这样做:

vsprintf(str_replace(['?'], ['\'%s\''], $query->toSql()), $query->getBindings())
白祺然
2023-03-14

除了@wader的答案之外,还有一种使用绑定获取原始SQL查询的“macroable”方法。

>

  • AppServiceProviderstart()方法中添加以下宏函数。

    \Illuminate\Database\Query\Builder::macro('toRawSql', function(){
        return array_reduce($this->getBindings(), function($sql, $binding){
            return preg_replace('/\?/', is_numeric($binding) ? $binding : "'".$binding."'" , $sql, 1);
        }, $this->toSql());
    });
    

    向雄辩的生成器添加别名。

    \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function(){
        return ($this->getQuery()->toRawSql());
    });
    

    然后像往常一样调试。

    \Log::debug(User::first()->jobs()->toRawSql());
    

    注意:从Laravel 5.1到5.3,由于Eloquent Builder没有使用MacroTable特性,因此不能动态向Eloquent Builder添加toRawSql别名。按照下面的示例实现相同的功能。

    例如,雄辩的建设者(Laravel 5.1-5.3)

    \Log::debug(User::first()->jobs()->getQuery()->toRawSql());
    

  • 蒋烨然
    2023-03-14

    Laravel使用准备好的语句。它们是一种编写SQL语句的方法,而无需将变量直接放入SQL字符串。<代码>?您看到的是信息的占位符或绑定,这些信息稍后将被PDO替换并自动清理。有关预准备语句的详细信息,请参阅PHP文档http://php.net/manual/en/pdo.prepared-statements.php

    要查看将被替换到查询字符串中的数据,可以对查询调用getBindings()函数,如下所示。

    $query = User::first()->jobs();
    
    dd($query->toSql(), $query->getBindings());
    

    绑定数组的替换顺序与SQL语句中出现的相同。

     类似资料:
    • 本文向大家介绍JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法,包括了JavaScript实现检查页面上的广告是否被AdBlock屏蔽了的方法的使用技巧和注意事项,需要的朋友参考一下 每个人都讨厌广告。看电视、看电影、看优酷、看网页时,对满天飞的广告也是深恶痛绝。广告是一个不招人喜欢的东西。但是,对一个中小网站站长/博客主来说,广告几乎是唯一的能成支持网站/博客正常运转的资

    • 本文向大家介绍Android屏蔽EditText软键盘的方法,包括了Android屏蔽EditText软键盘的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android屏蔽EditText软键盘的方法。分享给大家供大家参考。具体如下: java代码如下: 可以通过下面方法恢复显示: 希望本文所述对大家的Android程序设计有所帮助。

    • 本文向大家介绍用js屏蔽被http劫持的浮动广告实现方法,包括了用js屏蔽被http劫持的浮动广告实现方法的使用技巧和注意事项,需要的朋友参考一下 最近发现网站经常在右下角弹出一个浮动广告,开始的时候以为只是浏览器的广告。 后来越来越多同事反映在家里不同浏览器也会出现广告。然后深入检查了下,发现网站竟然被劫持了。 然后百度了一大堆资料,什么http劫持、dns劫持、运营商劫持之类的,确定真的是中招

    • 本文向大家介绍C#中实现屏蔽Ctrl+C的方法,包括了C#中实现屏蔽Ctrl+C的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#实现屏蔽Ctrl+C的方法,代码简单易懂,具有一定的实用价值。分享给大家供大家参考。具体方法如下: 主要实现方法为重写 WndProc,代码如下: 希望本文所述C#实例对大家有所帮助。

    • 我有一个数组,我想屏蔽它,这样我就可以保持它的形状,即,不删除屏蔽的元素。 例如在此代码中 打印输入是对未屏蔽元素进行上述数学运算的结果,并返回一个没有屏蔽元素的1D数组。