Laravel 中利用『模型事件』来实现删除数据时的连带删除

删除一条数据库记录的时候希望能自动删除这条记录关联的其它数据,如删除用户后连带删除其创建的文章和图片。
1、可以用Eloquent的deleting事件来实现:

class WheelActivity extends Model
{
    public function awards() {
        return $this->hasMany('App\Model\WheelAward', 'wheel_activity_id', 'id');
    }

    protected static function boot()
    {
        parent::boot();

        static::deleting(function($wheelactivity){
            $wheelactivity->awards()->delete();
        });
    }

    **注:** 在控制器中删除时必须使用first()查询,否则无效。
    example:WheelActivity::where('id', $id)->first()->delete();
}

2、在控制其中直接删除

    $user = User::find($id);
    $user->photos()->delete();   //  删除关联表的数据
    $user->delete();             //  删除主表数据

3、在AppServiceProvider 监听模型事件(不建议)

    public function boot()
    {
        WheelActivity::deleting(function($wheelactivity){
            $wheelactivity->awards()->delete();
        });
    }

4、使用事物(自己脑补吧,这里不做具体说明)。

博客地址:http://blog.jstm365.com

本作品采用《CC 协议》,转载必须注明作者和本文链接
不要轻易放弃。学习成长的路上,我们长路漫漫,只因学无止境 Don't give up easily. On the way of learning and growing up, we have a long way to go, just because there is no end to learning.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

如果WheelActivity::where('id', $id)->first()返回空报错的,需要先判断

WheelActivity::where('id', $id)->first()->delete();

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!