美文网首页laravelLaravel
laravel之关联自动删除使用Trait

laravel之关联自动删除使用Trait

作者: 空气KQ | 来源:发表于2018-09-22 11:21 被阅读1次

    中间表删除,使用的时detach

    如果我们想自动删除呢,不需要手动使用这个函数时,有没办法,当然有的

    第一种直接方法boot方法

    比如我景点关联了tag标签,我现在要删除景点,同时tag标签中间表也要删除。
    这里之说删除,当然你可以做很多的事情,例如全局查询返回,关联更新等
    我们的目的时让智能来减少我们的代码量,让包装更加好看,让代码越写越少。

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Scenic extends Model
    {
       
        public function tags()
        {
            return $this->morphToMany('App\Models\Tag','model', 'tag_rels');
        }
        public function areas()
        {
            return $this->hasOne('App\Models\AreaRel','model_id','id')->where('model_type','scenic');
        }
        public static function getList(){
            return self::where('is_checked',1)->get();
        }
    
    
        public static function boot()
        {
           // 调用deleting函数时
            static::deleting(function ($model) {
                if (method_exists($model, 'isForceDeleting') && ! $model->isForceDeleting()) {
                    return;
                }
                //我们上面定义的关联
                $model->tags()->detach();
            });
        }
    }
    

    第二种使用Trait,方便是可插拔,跟插头一样,不用就拔掉

    这个文件位置随便你写,只要你正确书写的类能找到即可
    例如我的:app/Classc/ScenicTrait.php

    <?php
    
    namespace App\Classc;
    
    trait ScenicTrait
    {
        public static function bootScenicTrait()
        {
            static::deleting(function ($model) {
                if (method_exists($model, 'isForceDeleting') && ! $model->isForceDeleting()) {
                    return;
                }
    
                $model->tags()->detach();
            });
        }
    }
    

    使用

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use App\Classc\ScenicTrait;
    
    class Scenic extends Model
    {
        //
        use ScenicTrait;
        ...
    }
    

    相关文章

      网友评论

        本文标题:laravel之关联自动删除使用Trait

        本文链接:https://www.haomeiwen.com/subject/vcntoftx.html