Для полиморфных многомерных отношений laravel, как вы добавляете ограничения базы данных? - PullRequest
0 голосов
/ 23 сентября 2019

Для полиморфного отношения Laravel «многие ко многим», как вы указываете в миграции базы данных, что должно существовать ограничение базы данных, например, каскад вниз?

Так, например, у вас есть модель тегов, которая имеетотношения morphedByMany с продуктами и модель продукта, которая имеет отношения morphToMany с тегами.Затем, имея полиморфную сводную таблицу, как вы можете удалить сопоставление в сводной таблице в случае, если продукт и / или тег удалены.

Существует таблица тегов и таблица taggables, которая является сводной таблицей, котораясопоставляет тег с taggable_type и taggable_id.

Фрагмент из модели продукта

/**
     * Tag relation
     *
     * @var $query
     */
    public function tags(){
        return $this->morphToMany(Tag::class, 'taggable')->withTimestamps();
    }

    /**
     * Tag relation
     *
     * @var $query
     */
    public function tag($tag){
        return $this->tags()->attach($tag);
    }

Фрагмент из модели тега

/**
     * Product relation
     *
     * @var $query
     */
    public function products(){
        return $this->morphedByMany(Product::class, 'taggable')->withTimestamps();
    }

Миграция базы данных taggables

Schema::create('taggables', function (Blueprint $table) {
        $table->primary(['tag_id', 'taggable_id', 'taggable_type']); //This is to avoid duplicate  relationships

        $table->unsignedInteger('tag_id');
        $table->unsignedInteger('taggable_id');
        $table->string('taggable_type');

        $table->timestamps();
    });

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Не знаете, как этого добиться с помощью ограничений базы данных, но не могли бы вы использовать переопределение метода загрузки модели?Например, включить это в модель вашего продукта:

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

    static::deleting(function ($product) {
        $product->tags()->detach();
    });
}

Это означает, что всякий раз, когда ваш продукт удаляется, все связанные теги также удаляются.

0 голосов
/ 23 сентября 2019

Это должно удалить запись в сводной таблице, если вы удалите элемент в таблице: $tablename->foreign('taggable_id') ->references('taggable_type')->on('tags') ->onDelete('cascade');

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...