Laravel - 多重启动覆盖

时间:2017-03-26 11:36:00

标签: php laravel laravel-5 eloquent laravel-eloquent

在我的laravel项目中,我想使用一个特性来使用uuid作为主键并进行级联删除。

有两种型号:UserBox

user可以包含多个BoxBox也可以包含多个Box。 因为我使用mysql,onDelete('cascade')无效,我需要它。

所以我覆盖模型的Boot方法来强制它,但是现在,我的特征的Boot方法(UuidIdentifiable)无法调用。

此特征的效用是在创建新模型时为主键生成uuid

现在,当我想创建模型时,当Eloquent插入值时,数据库会返回错误,因为我的模型的Id为空。

因此,覆盖模型上的Boot应该覆盖特征的Boot但是如何获得我的特征和模型的自定义Boot方法的功能?

<!-- language: php -->
class Box extends Model
{
    use UuidIdentifiable;

    protected $fillable = ['label', 'parent_box_id', 'user_id'];
    protected $guarded = [];
    public $incrementing = false;

    public function owner() {
        return $this->belongsTo('App\User', 'user_id');
    }

    public function parent() {
        return $this->belongsTo('App\Box', 'parent_box_id');
    }

    public function boxes (){
        return $this->hasMany('App\box', 'parent_box_id', 'id');
    }

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

        static::deleting(function(Box $box) {
            $box->boxes()->delete();
        });
    }
}

class User extends Authenticatable
{
    use Notifiable, UuidIdentifiable;
    public $incrementing = false;

    protected $fillable = ['username', 'email', 'password'];

    protected $hidden = ['password', 'remember_token'];

    public function boxes (){
        return $this->hasMany('App\box', 'user_id', 'id');
    }

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

        static::deleting(function(User $user) {
            $user->boxes()->delete();
        });
    }
}

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

        static::creating(function ($model) {
            $model->{$model->getKeyName()} = Uuid::generate()->string;
        });
    }
}

1 个答案:

答案 0 :(得分:0)

只是使用这个技巧:

trait UuidIdentifiable
{
    protected static function bootUuidIdentifiable()
    {
        static::creating(function ($model) {
            $model->{$model->getKeyName()} = Uuid::generate()->string;
        });
    }
}

所以,如果您将boot更改为bootYourTraitName并删除parent::boot();

我认为你的问题会解决