请问 DB facade 到底能不能实现 Eloquent ORM 的数据库事物操作?
我是用 Eloquent ORM 操作的数据库,现在遇到了需要向2张表插入信息的原子操作(一张是文章列表,另一张是文章内容表)。
显然,这两个插入应该是原子操作,我尝试着用 DB facade 来实现,如下:
DB::transaction(function () {
articleModel::create():
articleContentModel::create():
});
第二种方法:
DB::beginTransaction();
try{
articleModel::create():
articleContentModel::create():
DB::commit();
}catch(\Exception $e){
DB::rollBack();
}
这些代码虽然都能运行,但是都没有实现原子操作。
而且我还试了把 DB 换成我创建的 model,发现提示对象没有此方法。
但是文档里又清楚的说明了:
使用 DB facade 的事务方法也适用于 查询语句构造器 and Eloquent ORM。
引用位置点此
那么, DB facade 到底能不能实现 Eloquent ORM 的数据库事物操作呢?
还有,文档说的又是什么意思?
关于 LearnKu
我觉得这是中文用词理解有歧义的锅:joy:
英文原版是这样的:
译者的“适用于”并不是指Eloquent ORM用有
transaction方法。生硬一点的翻译就是:使用DB facade的
transaction方法也能为查询构造器和Eloquent ORM提供事务控制。@leo 2个表分两次插入,第二表我故意把一个字段设为空。在一次表单提交中,第一个表有记录,第二个表没有记录,并报错。
另外,我的数据库是mysql,不能支持事务吗?
@树梢的阳光 如果数据库引擎是 myisam 的话就不支持
@树梢的阳光 是这样的,DB 有默认的数据库连接,它只能保护和它连接的数据库。如果 articleModel 或者 articleContentModel 所在的数据库和 DB 默认数据库不相同, DB 是没办法进行事务的。
这种情况的解决方法就是写两个 beginTransaction;