我:这是一个混合问题| 访客:( wtf?)这意味着什么?
我在一个问题中提出两个问题(紧密耦合)
使用:Laravel 5.5& MySQL的
我试图删除具有以下关系的User
belongsTo Address
,
belongsTo Package
,
hasMany Orders
,
hasMany Comments
Orders
或User
时 Product
级联
<{1}}或COmments
被删除时User
级联。
现在如何删除Post
&amp;自动关联User
&amp; orders
已删除?
当我尝试删除comments
laravel抛出异常时:
$user->delete()
所以我决定使用一个交易删除,用户,关联的订单和评论, 确保删除所有内容。
但我没有在eloquent中找到任何事务但在查询构建器(DB)中找不到。
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`cybertron`.`comments`, CONSTRAINT `comments_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) (SQL: delete from `users` where `id` = 4)
)这会被视为交易吗?像:
$user->delete
如果没有,那么我如何与Eloquent进行交易?
非常感谢任何帮助
答案 0 :(得分:2)
您有Eloquent events对于删除,但您也可以覆盖默认删除方法,如下所示:
public function delete()
{
\DB::transaction(function() {
$this->comments()->delete();
$this->orders()->delete();
parent::delete();
});
}
是的,Eloquent本身没有交易。您在显示时使用事务并在其中包装Eloquent或查询构建器。请注意,在您的情况下,您应该使用comments()
和orders()
代替comments
和orders
答案 1 :(得分:1)
@Marcin
如果要在模型上使用事件,则为了级联删除,需要确保您了解在Query对象上运行删除与在Model对象上运行删除之间的区别
例如: $ this-> orders()-> delete(); -该行实际上未加载订单模型 -$ this-> orders()-返回查询对象 -此行实际上将运行DELETE SQL语句
为了在删除用户时按顺序启动删除事件,您必须进行一次foreach foreach($ user-> orders as $ order)$ order-> delete();
启动user :: deleting事件时,加载用户的所有订单并调用delete; 这将触发order :: deleting事件,在该事件中,我们将加载所有注释对象并也将其删除