Laravel Eloquent ORM - 删除行和所有内部关系

时间:2014-04-23 00:52:18

标签: laravel eloquent

我有三个表,table1table2table3table1table2是一对多,table2table3是一对多。

我想调用Table1::find($id)::delete()并删除table2table3中的所有行。

我在表格中添加了以下内容:

表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的{​​{1}}函数吗?

3 个答案:

答案 0 :(得分:3)

您无法在集合上调用delete(),也无法在查询构建器上加载远远相关的集合,以删除相关模型,因此您需要的是:

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

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

答案 1 :(得分:0)

我认为这会依次删除所有相关的内容:

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

答案 2 :(得分:0)

我从laracasts中发现了这一点,并发现对我有用。 让我在这里粘贴答案: 所以我有两个模型-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