加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 19:50:36 所属栏目:大数据 来源:网络整理
导读:我知道我可以在查询构建器上使用toSql方法来获取带有SELECT语句的绑定参数占位符的原始SQL. AppUser::where(['id'='1'])-toSql(); 06001 但是如何才能获得DELETE语句呢? AppUser::where(['id'='1'])-delete()-toSql(); PHP error: Call to a member funct
我知道我可以在查询构建器上使用toSql方法来获取带有SELECT语句的绑定参数占位符的原始SQL.
AppUser::where(['id'=>'1'])->toSql();

06001

但是如何才能获得DELETE语句呢?

AppUser::where(['id'=>'1'])->delete()->toSql();

PHP error: Call to a member function toSql() on integer on line 1

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

但为什么,谁在乎呢?

这有点像xy problem.我的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]);
}

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

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

首先获取模型表的查询构建器实例.
$builder = DB::table((new User)->getTable());

然后获取语法并使用where子句从构建器编译delete语句.

$sql = $builder->getGrammar()->compileDelete($builder->where('id',1));

06002

现在,您可以自由地交换数据库驱动程序,并仍然获得适当的平台语法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读