相关疑难解决方法(0)

如何让查询生成器将其原始SQL查询输出为字符串?

给出以下代码:

DB::table('users')->get();
Run Code Online (Sandbox Code Playgroud)

我想获取上面的数据库查询生成器将生成的原始SQL查询字符串.在这个例子中,它将是SELECT * FROM users.

我该怎么做呢?

php sql laravel laravel-4 laravel-query-builder

470
推荐指数
25
解决办法
52万
查看次数

如何在Laravel 5中执行查询?DB :: getQueryLog()返回空数组

我正在尝试查看查询的日志,但DB::getQueryLog()只是返回一个空数组:

$user = User::find(5);
print_r(DB::getQueryLog());
Run Code Online (Sandbox Code Playgroud)

结果

Array
(
)
Run Code Online (Sandbox Code Playgroud)

如何查看此查询的日志?

php logging laravel laravel-5

161
推荐指数
7
解决办法
22万
查看次数

如何获取Laravel删除/更新/插入语句的原始SQL?

我知道我可以toSql在查询构建器上使用该方法来获取带有SELECT语句的绑定参数占位符的原始SQL .

App\User::where(['id'=>'1'])->toSql();
Run Code Online (Sandbox Code Playgroud)
"select * from `users` where (`id` = ?)"
Run Code Online (Sandbox Code Playgroud)

但是我怎么能得到这个DELETE声明呢?

App\User::where(['id'=>'1'])->delete()->toSql();
Run Code Online (Sandbox Code Playgroud)

PHP错误:在第1行的整数上调用成员函数toSql()

这会执行该语句,但我希望获得原始的,未插入的SQL,其中的问号代表值而不实际运行查询.同样的情况适用于任何修改声明,例如INSERTUPDATE

但为什么,谁在乎呢?

这有点像xy问题.我的Web应用程序包括一个多进程架构.它运行自定义工匠命令,异步通信在事件驱动的循环中监听,以更新数据库.

我需要原始查询的原因是因为我想重用一个准备好的语句来提高性能.不幸的是,雄辩的方法没有暴露准备好的语句,所以为了重用一个,我必须自己从底层的PDO连接中准备它.

$sql = 'UPDATE `foo` SET `bar` = ? WHERE (`id` = ?)';

$statement = DB::connection()->getPdo()->prepare($sql);

while (true) {
    $data = foo();
    $statement->execute([$data->bar, $data->id]);
}
Run Code Online (Sandbox Code Playgroud)

但是,这与抽象的SQL语法构建器不同.因为我现在正在使用MySQL,所以我可以在语法上包含反引号.但现在我被供应商锁定了.比方说,老板说明天我们要转移到MS SQL Server,然后很可能(至少)要抓住使用反引号而不是方括号的bug.

我想使用动态生成的SQL语法在预准备语句中重用.

php laravel eloquent

10
推荐指数
2
解决办法
5200
查看次数