public function jobs()
{
return $this->belongsToMany(Job::class, 'eqtype_jobs')
->withPivot(['created_at','updated_at','id'])
->orderBy('pivot_created_at','desc');
}
我只是要找到一个未找到的列,在这里我选择 created_at 并通过添加尾随 s 将其更改为 created_ats :
public function jobs()
{
return $this->belongsToMany(Job::class, 'eqtype_jobs')
->withPivot(['created_ats','updated_at','id'])
->orderBy('pivot_created_at','desc');
}
因此,debuger将返回以下错误:
(4/4)ErrorException SQLSTATE [42S22]:找不到列:1054'字段列表'中的未知列'eqtype_jobs.created_ats'(SQL:选择作业 . *,eqtype_jobs.set_id作为pivot_set_id,eqtype_jobs.job_id作为pivot_job_id,eqtype_jobs .created_ats as pivot_created_ats,eqtype_jobs.updated_at as pivot_updated_at,eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0)(查看:/ home /说/ WWW /工厂/资源/视图/设置/ show.blade.php)
上面的错误消息返回错误的完整SQL查询
SQL: select jobs.*, eqtype_jobs.set_id as pivot_set_id, eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where eqtype_jobs.set_id = 56 order by pivot_created_at desc limit 20 offset 0
现在,只需从created_at中删除额外的 s ,并在任何SQL编辑器(如phpMyAdmin SQL编辑器)中根据需要测试此SQL!
24 回答
在
QueryBuilder
实例上使用toSql()
方法 .DB::table('users')->toSql()
将返回:这比连接事件监听器更容易,并且还允许您在构建时随时检查查询的实际外观 .
要输出到最后一次运行的查询,您可以使用它
我相信最新的查询将位于数组的底部 .
你会有类似的东西:
根据下面的Joshua's评论,现在默认关闭 . 要使用,您需要手动启用它:
您可以收听'illuminate.query'事件 . 在查询之前添加以下事件侦听器:
这将打印出如下内容:
如果您尝试使用Illuminate而不使用Laravel来使用Log:
你也可以像这样快速启动一个函数:
EDIT
更新版本似乎默认禁用查询日志记录(上面返回一个空数组) . 要重新打开,在初始化Capsule Manager时,抓取连接实例并调用
enableQueryLog
方法EDIT AGAIN
考虑到实际问题,您实际上可以执行以下操作来转换当前单个查询而不是所有先前的查询:
DB::QueryLog()
仅在执行查询$builder->get()
后才起作用 . 如果要在执行查询之前获取查询,可以使用$builder->toSql()
方法 . 这是如何获取sql并绑定它的示例:在eloquent中有一种获取查询字符串的方法 .
toSql()
在我们的例子中,
返回
是返回SQL查询字符串的确切解决方案 . 希望这有用...
如果你使用laravel 5.1和MySQL,你可以使用我的这个功能:
作为输入参数,您可以使用其中任何一个
第一种方式:
只需使用 toSql() 方法即可完成以下操作:
如果它不起作用,你可以从laravel documentation设置 .
第二种方式:
另一种方法是
DB::getQueryLog()
但如果's returns an empty array then by default it' s禁用visit this,
只需启用
DB::enableQueryLog()
就可以了:)欲了解更多信息,请访问Github Issue了解更多信息 .
希望能帮助到你 :)
从laravel
5.2
开始 . 您可以使用DB::listen
来获取已执行的查询 .或者,如果要调试单个
Builder
实例,则可以使用toSql
方法 .这是函数,我放在我的基础模型类中 . 只需将查询构建器对象传递给它,就会返回SQL字符串 .
For laravel 5.5.X
如果您希望接收应用程序执行的每个SQL查询,可以使用listen方法 . 此方法对于记录查询或调试很有用 . 您可以在服务提供者中注册您的查询侦听器:
Source
要查看Laravel Executed Query,请使用laravel查询日志
首先您需要通过调用以下命令启用查询日志:
在使用数据库外观查询后,您可以编写:
输出如下:
作曲家需要“barryvdh / laravel-debugbar”:“2.3 . *”
你会看到
您可以使用此程序包获取加载页面时正在执行的所有查询
如果您不使用Laravel但使用Eloquent包,那么:
你可以用clockwork
但也适用于Firefox
我已经创建了一些简单的函数来从一些查询中获取SQL和绑定 .
用法:
该最简单的方法是制作 deliberate mistake . 例如,我想看到以下关系的完整SQL查询:
我只是要找到一个未找到的列,在这里我选择
created_at
并通过添加尾随s
将其更改为created_ats
:因此,debuger将返回以下错误:
上面的错误消息返回错误的完整SQL查询
现在,只需从created_at中删除额外的
s
,并在任何SQL编辑器(如phpMyAdmin SQL编辑器)中根据需要测试此SQL!注意:
该解决方案已经过Laravel 5.4测试 .
使用绑定获取SQL查询的 'macroable' 替换 .
E.g. Query Builder
E.g. Eloquent Builder
E.g. Eloquent Builder ( Laravel 5.1 - 5.3 )
这是我使用的解决方案:
请阅读代码中的注释 . 我知道,它并不完美,但对于我的日常调试来说还可以 . 它尝试以或多或少的可靠性构建绑定查询 . 但是,不要完全信任它,数据库引擎以不同的方式转义这个简短函数未实现的值 . 所以,仔细考虑结果 .
尽管我喜欢这个框架,但我讨厌它像垃圾一样 .
DB::enableQueryLog()
完全没用 .DB::listen
同样没用 . 当我说$query->count()
时它显示了部分查询,但是如果我做了$query->get()
,则无话可说 .似乎一致工作的唯一解决方案是故意在ORM参数中添加一些语法或其他错误,如不存在的列/表名,在调试模式下在命令行上运行代码,它将吐出SQL错误最后用完整的frickin'查询 . 否则,如果从Web服务器运行,希望错误出现在日志文件中 .
Print last query