Лучший способ удалить связанные столбцы с отношениями - PullRequest
0 голосов
/ 01 июня 2018

Например, у нас есть таблица p_categories и таблица продуктов.Таблица

p_categories:

╔═══╦════════════╦═════════════╗
║   ║ id         ║ name        ║
╠═══╬════════════╬═════════════╣
║ 1 ║ 1          ║ tech        ║
║ 2 ║ 2          ║ food        ║
║ 3 ║ 3          ║ sport       ║
╚═══╩════════════╩═════════════╝

Таблица продуктов:

╔════╦═══════════════╦═════╗
║ id ║p_categories_id║name ║
╠════╬═══════════════╬═════╣
║ 1  ║ 1             ║phone║
╠════╬═══════════════╬═════╣
║ 2  ║ 2             ║spoon║
╠════╬═══════════════╬═════╣
║ 3  ║ 2             ║fork ║
╚════╩═══════════════╩═════╝

В модели pcategory у меня есть:

public function products()
{
    return $this->hasMany(Product::class, 'p_categories_id');
}

ВМодель продукта:

public function category()
{
    return $this->belongsTo(PCategory::class,'p_categories_id', 'id');
}

Когда я пытаюсь удалить техническую категорию, в строке product table id=1, p_categories_id=1, name=phone необходимо удалить то же самое время.

вероятно, решения, которые я подумал:

1) изменение типов столбцов на каскадные.Я прочитал несколько постов.Люди в основном не рекомендуют это.

2) в модель категории добавляется новая функция

protected static function boot() {
parent::boot();
static::deleting(//something, i don't know how to make.); }

Мне нужно изменить весь проект с помощью этого метода.Потому что нет ни одного.Я ищу лучший способ сделать это.Я написал 2, вероятно, решения, но я до сих пор не знаю, как их правильно сделать.Я надеюсь, что смогу объяснить, заранее спасибо

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Чтобы использовать события Eloquent в модели, вы можете сделать что-то вроде:

static::deleting(function (self $category) {
    $category->products()->delete();
});

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

$category->products->each(function ($product) {
    $product->delete();
});

Документация не показывает вышеуказанный метод и вместо этого предпочитает использовать Observers, но показывает, к каким событиям модели вы имеете доступ.

0 голосов
/ 01 июня 2018

Вы должны использовать ограничение внешнего ключа базы данных.Для создания базы данных с использованием миграции Laravel вы можете использовать

$table->foreign('p_categories_id')
      ->references('id')->on('p_categories ')
      ->onDelete('cascade');

см. https://laravel.com/docs/5.5/migrations#foreign-key-constraints

...