laravelLaravel

laravel之关联自动删除使用Trait

2018-09-22  本文已影响1人  空气KQ

中间表删除,使用的时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;
    ...
}
上一篇 下一篇

猜你喜欢

热点阅读