如何使用 'cascade' 删除用户并自动删除他的所有关系?

How to delete a user and automatically all his relations using 'cascade'?

我正在尝试删除一个用户并使用 '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');
        });
    }

我正在尝试使用 tinker:

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

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

您可以在删除用户时通过使用删除事件删除相关模型来删除相关模型,而不是数据库级联。

将其包含在用户模型的引导函数中:

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

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

            $user->profile->delete();

        });
    }

您可以使用模型事件:

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();
        });
    }
}

这样,每当您在 User 对象上调用 delete() 方法时,Laravel 将在之前触发 $user->profile->delete();

使用级联不需要关系人员。这段代码对我来说很好用 -

迁移:

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();
}

查看删除Link

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

路线

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