Удалить второй уровень принадлежности в Eloquent - PullRequest
0 голосов
/ 24 февраля 2019

Мое приложение имеет Category модель.Каждый Category может иметь много Subcategories, поэтому каждый Subcategory belongsTo a Category.Из модели Subcategory:

public function category()
{
    return $this->belongsTo('App\Category');
}

С другой стороны, есть модель Friend.Теперь каждая пара Friend/Subcategory соединена через сводную таблицу friend_score:

id | friend_id | subcategory_id | score

Из модели Subcategory:

/**
 * The friend scores that belong to the subcategory.
 */
public function friends()
{
    return $this->belongsToMany('App\Friend', 'friend_score')->withPivot('score');
}

Из модели Friend:

/**
 * The subcategory scores that belong to the friend.
 */
public function subcategories()
{
    return $this->belongsToMany('App\Subcategory', 'friend_score')->withPivot('score');
}

Когда я удаляю подкатегорию, Eloquent автоматически и правильно удаляет записи из таблицы friend_score для этого subcategory_id.

Когда я удаляю категорию, она правильно удаляет подкатегориикоторые принадлежат этому category_id.Тем не менее, в этом случае связанные друг с другом значения остаются в базе данных.

Как мне сделать так, чтобы при удалении категории дочернее_значение для каждой дочерней подкатегории?

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

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

Subcategory Модель:

/**
 * Boot eloquent model events
 * 
 * @return void
 */
public static function boot() {

    parent::boot();

    // This will be called just before deleting a
    // subcategory entry

    static::deleting(function($subcategory) {

        Friend::where('subcategory_id', $subcategory->id)->delete();
    });
}

Прежде чем делать что-либо из этого, вы можете выполнить очисткуследующим образом:

Friend::whereDoesntHave('subcategories')->get();

Проверьте, возвращает ли верный результат правильный результат записей, которые не имеют никакого отношения к таблице подкатегорий.Затем вы можете позвонить ->delete() вместо ->get(), чтобы очистить записи модели друзей.

0 голосов
/ 24 февраля 2019

В вашей миграции friend_score вы можете определить subcategory_id как внешний ключ.Затем вы можете выбрать, что будет с сводными записями, с помощью метода onDelete() при удалении подкатегории.

$table->foreign('subcategory_id')
      ->references('id')
      ->on('subcategories')
      ->onDelete('cascade');

При использовании опции каскада при удалении подкатегории будут удалены все связанные сводные записи.

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

category-> подкатегория -> оценки друзей (сводка)

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