Laravel Eloquent ORM - удаление строк и всех внутренних связей

У меня есть три стола, table1, table2, а также table3, table1 один ко многим table2 а также table2 один ко многим table3,

Я хочу призвать Table1::find($id)::delete() и иметь все строки из table2 а также table3 также удалено

Я добавил следующее в мои таблицы:

Таблица 1

public function delete()
{
    $this->table2()->delete();
    return parent::delete();
}

Таблица 2

public function delete()
{
    $this->table3()->delete();
    return parent::delete();
}

Тем не менее, мои строки из table3 не удаляются. Table3удаляются строки, если я вручную вызываю функцию удаления из модели table2, То, как я написал код, не должно delete() функция от table2 быть вызванным когда table1 называет это?

2 ответа

Решение

Вы не можете вызвать delete() для коллекции, ни загрузить далеко связанную коллекцию в построителе запросов, чтобы удалить связанные модели, поэтому вам нужно следующее:

// Table1 model
public function delete()
{
  $this->table2->each(function ($model2) {
    $model2->table3()->delete();
  });

  $this->table2()->delete();
  return parent::delete();
}

Я думаю, что это удалит последовательно все связанные:

// Table1
public function delete()
{
    $this->table2()->delete();
    $this->table2()->table3()->delete();
    return parent::delete();
}

Я нашел это из ларакастов и нашел это полезным для себя. Позвольте мне вставить ответ здесь: Итак, у меня есть две модели - User и Property User.php.

public function properties()
    {
        return $this->hasMany('App\Models\Property');
    }

Property.php

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

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

public function destroy($id)
    {
        $user = User::findOrFail($id);

        $user->properties()->delete();

        $user->delete();

        return [
            'message' => 'Delete Complete!'
        ];
    }

Я надеюсь, что вам или кому-либо еще это пригодится! С уважением:)

Источник: https://laracasts.com/discuss/channels/eloquent/laravel-delete-model-with-all-relations

Другие вопросы по тегам