Как удалить все строки на основе одного столбца в отношении один ко многим в laravel eloquent? - PullRequest
1 голос
/ 26 января 2020

При удалении определенного mov ie, я хочу удалить все showtime, связанные с ним. У меня есть 3 таблицы, связанные с этим запросом.

  1. Showtime (который имеет отношение мм с таблицей времени (сводная таблица showtime_time)
  2. Times
  3. Фильмы

Что я пробовал:

MovieController:

public function destroy($id)
{
    $movie = Movie::findOrFail($id);
    if (ShowTime::where('movie_id', '=', $id)->exists()) {
        $showtimes = ShowTime::whereIn('movie_id', '=', $id)->get();
        foreach ($showtimes as $showtime) {
            $showtime->times()->detach();
            $showtime->delete();
            $movie->delete();
        }
        return back();
    } else {
        $movie->delete();
    }
    return redirect()->route('movies.index');

}

, который дал мне эту ошибку.

Аргумент 1 передан в Illuminate \ Database \ Query \ Builder :: cleanBindings () должен иметь тип массива с заданной строкой и вызываться в C: \ Users \ lenovo \ cinetime_nepal_backend \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Query \ Builder. php on line 907

Класс модели

<?php

namespace Modules\Movie\Entities;
use Illuminate\Database\Eloquent\Model;
class Movie extends Model
{
    protected $guarded = ['id']; //fillable
    protected $hidden = ['created_at', 'updated_at'];

    public function showTimes()
    {
        return $this->hasMany(ShowTime::class, 'movie_id');
    }
}

Вот так я удаляю showtime в showtimecontroller

ShowtimeController

public function destroy($id)
{
    $showtime = ShowTime::findOrFail($id);
    $showtime->times()->detach();
    $showtime->delete();
    return back();
}

Я плохо знакомый с laravel, я искал и пробовал много кодов, ответили на этом сайте, но не мог помочь себе. Помогите пожалуйста

1 Ответ

1 голос
/ 26 января 2020

Если вы используете MySQL, вы можете добавить 'ON DELETE CASCADE' к своему внешнему ключу. Это автоматически удалит все записи, которые ссылаются на родителя при удалении родителя. просто поместите его в свою миграцию showtime

$table->foreign('movie_id')->references('id')->on('movies')->onDelete('cascade');

Или, если вы не хотите такой подход, вы можете перезаписать свой метод удаления в вашей модели mov ie. Вставьте этот код в модель mov ie.

public function delete() {
    $this->showTimes()->times()->delete();
    $this->showTimes()->delete();
    parent::delete();
}

Затем в контроллере вы просто удаляете mov ie, и все в порядке.

public function destroy($id)
{
    $movie = Movie::findOrFail($id);
    $movie->delete();

    return redirect()->route('movies.index');

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