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