如何使用“级联”删除用户并自动删除其所有关系?

时间:2019-05-12 15:52:23

标签: mysql laravel cascade

我正在尝试删除用户,并使用“级联”自动删除其所有关系。不知道该怎么做。我正在使用mysql。 到目前为止,我已经做到了:

用户模型

class User extends Authenticatable
{
    use Notifiable;

    //...

    public function profile()

    {
        return $this->hasOne('App\Profile');
    }
}

个人资料模型

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

个人资料迁移

    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->integer('phone');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
    }

我想尝试修补:

$user = App\User::firsts();
$user->delete(); // it deletes only the user

$user->profile->delete(); // it deletes only the profile

3 个答案:

答案 0 :(得分:1)

除了通过数据库级​​联,您还可以通过使用delete事件删除相关模型来删除用户时删除相关模型。

将其包括在用户模型的启动功能中:

public static function boot ()
    {
        parent::boot();

        self::deleting(function (User $user) {

            $user->profile->delete();

        });
    }

答案 1 :(得分:1)

您可以使用模型事件:

class User extends Eloquent
{    
    public static function boot ()
    {

        parent::boot();

        self::deleting(function ($user) {
            // This will be executed right before the user is deleted
            $user->profile->delete();
        });
    }
}

通过这种方式,每当您在delete()对象上调用User方法时,Laravel都会立即触发$user->profile->delete();

答案 2 :(得分:1)

不需要级联人员来进行级联工作。这段代码对我来说很好-

迁移:

Schema::create('profiles', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->unsignedBigInteger('user_id');
        $table->integer('phone');
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });

控制器: ->delete()在这里可以删除用户和个人资料行

public function deleteUser(){
    Auth::user()->delete();
    return redirect()->back();
}

查看删除链接

<a href="{{ route('deleteUser') }}">Delete</a>

路线

Route::get('/delete', 'HomeController@deleteUser')->name('deleteUser');