提问者:小点点

Laravel雄辩的ORM-删除行和所有内部关系


我有三个表,table1table2table3<代码>表1是一对多对表2表2是一对多对表3

我想调用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中的行没有被删除。如果我从模型table2中手动调用删除函数,Table3中的行将被删除。按照我编写代码的方式,当table1调用table2函数时,不应该调用它吗?


共3个答案

匿名用户

您不能对集合调用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();
}

匿名用户

我从laracasts那里找到了这个,发现它对我很有用。让我把答案贴在这里:我有两个模型——用户和属性用户。php

public function properties()
    {
        return $this->hasMany('App\Models\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