我正在尝试调试一些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`
那个问号在那里做什么?我已经测试了查询,它可以按预期工作。这是因为我选择的第一个()用户,这是发生?
只是为了重申@giovannipds伟大的答案...我这样做:
vsprintf(str_replace(['?'], ['\'%s\''], $query->toSql()), $query->getBindings())
除了@wader的答案之外,还有一种使用绑定获取原始SQL查询的“macroable”方法。
>
在AppServiceProvider
start()
方法中添加以下宏函数。
\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());
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数组。