Миграции в Laravel, как работает метод onDelete()?

229
12 февраля 2020, 08:50

Не могу понять как в миграциях Laravel работает onDelete(). Например, такая ситуация. При удалении записи в родительской таблице, нужно каскадно удалить записи и из дочерних. Как правильно указать каскадное удаление? Написать у ключа в родительской таблице:

$table->increments('id')->onDelete('cascade');

Или написать у внешнего ключа в дочерней таблице:

$table->integer('child_id')->unsigned();
$table->foreign('child_id')->reference('id')->on('mouther')->onDelete('cascade');

UPD:
Добавил код миграций
Есть родительская таблица "Дом":

Schema::create('house', function (Blueprint $table) {
            $table->increments('id')
                ->comment('ID');
            ...
}

И есть дочерняя таблица "Квартира":

Schema::create('apartment', function (Blueprint $table) {
            $table->increments('id')
                ->comment('ID');
            $table->integer('house_id')
                ->unsigned()
                ->comment('ID дома');
            $table->foreign('house_id')
                ->reference('id')->on('house')
                ->onDelete('cascade');
            ...
}

Если удаление указывается у внешнего ключа в дочерней таблице, то если в цепочке ее не указать в одном месте, то удаление остановится?
Например.
Таблицы "Дом"->"Квартира"->"Комната". В "Квартире" есть поле "house_id" со внешним ключом на "id" в таблице "Дом" и у него указано каскадное удаление. А в таблице "Комната" есть поле "apartment_id" со внешним ключом на "id" в таблице "Квартира" и у него НЕ указано каскадное удаление. В таком случае, если удалить строку из "Домов", связанные строки в "Квартирах" будут удалены, а в "Комнатах" нет? Или такая ситуация невозможна, так как "Комнате" будет не на что смотреть и все просто сломается?

Answer 1

Каскадное удаление ставится в дочерних таблицах. Это говорит, как вы уже поняли, что если родитель удалить, то и все дочерние удалить. Но если дочерний является родителем для следующей дочерней таблицы, то просто вылезет ошибка при удалении, что не могу удалить родительскую запись, так как на нее ссылается дочерний.

Поэтому надо везде в цепочке указывать каскадное удаление, при условии что это необходимо.

READ ALSO
Фильтрация файлов из папки в bitrix

Фильтрация файлов из папки в bitrix

Вообщем есть такая проблема, мне нужно из папки вытаскивать названия файлов по определённой маске, но так как я не силён в регулярных выражения...

233
Дженерик и интерфейсы

Дженерик и интерфейсы

Как указать, что тип аргумента класса-дженерика должен имплементировать какой-то интерфейс? Если можно, примерВопрос и для C#, и для Java

284
Android Отправка запросов в фоне

Android Отправка запросов в фоне

Нужно отправлять post запрос на сервер, дабы проверить, есть ли уведомления для этого приложенияКак это реализовать, понятия не имею

271