Удаление записей из связанных таблиц
Удаление записей из связанных таблиц
Подскажите, как лучше удалить несколько записей из двух связанных (один к одному) таблиц.
Приходит массив id-шников. Надо удалить из одной таблицы все записи с этими id-шниками и из связной с ней, где тоже записи с такими id-шниками.
можно простым перебором сначала из одной, потом из другой.
А есть ли какой-то способ с join. Ну или чтобы удалить записи, передав сразу массив id-шников.
Приходит массив id-шников. Надо удалить из одной таблицы все записи с этими id-шниками и из связной с ней, где тоже записи с такими id-шниками.
можно простым перебором сначала из одной, потом из другой.
А есть ли какой-то способ с join. Ну или чтобы удалить записи, передав сразу массив id-шников.
Re: Удаление записей из связанных таблиц
Настройка каскадного удаления в БД по ключу. Либо $model->unlinkAll('Название связи', true); Удалить скопом можно при помощи статического метода Класс_модели::deleteAll(['id' => [1,2,3,4,5]]).
Re: Удаление записей из связанных таблиц
$model->unlinkAll() удаляет только одну запись из двух связанных таблиц?
если использовать Класс_модели::deleteAll(['id' => [1,2,3,4,5]]), то придётся сначала удалить записи из одной таблице, а потом из другой?
если использовать Класс_модели::deleteAll(['id' => [1,2,3,4,5]]), то придётся сначала удалить записи из одной таблице, а потом из другой?
Re: Удаление записей из связанных таблиц
Да, например можно переопределить в основной модели метод beforeDelete() и разрывать связь там (но удалять основные модели придётся в цикле через ->delete() а не deleteAll(), т.к. при deleteAll() не вызывается beforeDelete()).
Всё верно.
Однако самым простым и эффективным остаётся вариант с настройкой каскадного удаления по ключу в БД.
Re: Удаление записей из связанных таблиц
но для этого придётся настраивать через админку БД. Или это можно как-то сделать средствами yii2?Однако самым простым и эффективным остаётся вариант с настройкой каскадного удаления по ключу в БД.
- PartyPoison
- Сообщения: 69
- Зарегистрирован: 2017.04.27, 11:04
Re: Удаление записей из связанных таблиц
Добавить ключи можно с помощью миграций, также указать действие при обновлении удалении cascade restrict и т д.
Пример миграции:
Код: Выделить всё
class m170412_093436_add_adv_company_struct extends Migration
{
public function safeUp()
{
$this->createIndex('fk_adv_company_site1_idx', 'adv_company', 'site_id');
$this->addForeignKey('fk_adv_company_site1', 'adv_company', 'site_id', 'site', 'id', 'CASCADE', 'RESTRICT');
$this->createIndex('fk_banner_item_has_adv_company_adv_company1_idx', 'banner_item_has_adv_company', 'adv_company_id');
$this->createIndex('fk_banner_item_has_adv_company_banner_item1_idx', 'banner_item_has_adv_company', 'banner_item_id');
$this->addForeignKey('fk_banner_item_has_adv_company_banner_item1', 'banner_item_has_adv_company',
'adv_company_id', 'adv_company', 'id', 'CASCADE', 'CASCADE');
$this->addForeignKey('fk_banner_item_has_adv_company_adv_company1', 'banner_item_has_adv_company',
'banner_item_id', 'banner_item', 'id', 'CASCADE', 'CASCADE');
}
}
Re: Удаление записей из связанных таблиц
т.е. если связь в БД будет указанна как cascade, то при удалении одной записи из связных таблиц, автоматически удаляется и связанная с ней из другой таблицы? тогда как в этом случае записывается удаление для нескольких строк?
Re: Удаление записей из связанных таблиц
Если не нужны beforeDelete() и afterDelete(), то вызываете Класс_модели::deleteAll(['id' => [1,2,3,4,5]]) для основных записей. Из связанной таблицы БД сама удалит записи.
Re: Удаление записей из связанных таблиц
Лучше удалять связанные данные методом beforeDelete - так вы можете попутно указать что еще нужно удалить при удалении записи из бд и вызывать у связаной модели так же метод beforeDelete - может почистить картинки или рейтинг
Код: Выделить всё
public function beforeDelete()
{
if (parent::beforeDelete()) {
// Clear recept Ingridient Lists
if($this->receptIngridientLists) {
foreach ($this->receptIngridientLists as $model) {
$model->delete();
}
}
// Clear recept Description Lists
if($this->receptDescriptionLists) {
foreach ($this->receptDescriptionLists as $model) {
$model->delete();
}
}
return true;
} else {
return false;
}
}
Кулинарные рецепты с фото на food-list.ru