Как удалить строки из сводной таблицы в Laravel? - PullRequest
0 голосов
/ 30 января 2020

У меня есть таблица films, которая содержит отношение «многие ко многим», например, AgeRatings с сводной таблицей с именем film_age_rating, которая содержит film_id в качестве внешнего ключа. У меня это тоже есть с 3 другими отношениями.

В настоящее время мое приложение не имеет функции для отправки запроса на удаление, чтобы удалить фильм, поэтому сейчас я жестко удаляю строки в таблице БД films. Когда я удаляю фильм из таблицы films, он удаляет элементы, но данные в сводной таблице остаются неизменными, чего я не хочу.

films_table

public function up()
{
    Schema::create('films', function (Blueprint $table) {
    $table->uuid('id')->primary();
    $table->string('name')->nullable();
}

film_age_rating

public function up()
    {
        Schema::create('film_age_ratings', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('age_rating_id');
            $table->uuid('film_id');
            $table->timestamps();
        });
}

Модель фильма

public function ageRatings(): BelongsToMany
{
    return $this->belongsToMany(
        AgeRatings::class,
        'film_age_rating',
        'film_id',
        'age_rating_id'
    );
}

Возрастной рейтинг Модель

public function film(): BelongsToMany
{
    return $this->belongsToMany(
        Film::class,
        'film_age_rating',
        'age_rating_id',
        'film_id'
    );
}

Я знаю, что можно добавить каскад onDelete к сводным таблицам, но это потребует большого количества таблиц миграции. Есть ли другой способ решить эту проблему, не добавляя на данный момент запрос DELETE, или каскад является единственным вариантом?

Не могли бы вы посоветовать мне наиболее эффективный вариант?

Ответы [ 2 ]

0 голосов
/ 31 января 2020

Вы можете удалить данные, используя метод syn c () . Это освобождает отношение из сводной таблицы. Я предполагаю, что вы хотите удалить фильм . Так что это пример метода в вашем контроллере.

public function deleteFilm($id)
{
     $film = Film::find($id);
     $film->ageRatings()->sync([]);
     $film->delete();
}
0 голосов
/ 30 января 2020

Единственный способ, который я могу себе представить, это использовать softDeletes

. Таким образом, будет только один запрос на удаление фильма, и это будет логическое удаление.

...