删除具有外键约束的用户

时间:2015-12-26 21:02:33

标签: mysql laravel-5 foreign-keys constraints

我正在开发一个Laravel应用程序来管理案例研究,其中包含一个完整的管理控制台,其中包括可以登录系统的用户帐户的CRUD功能。

简而言之,案例研究和用户具有一对多的关系(用户可以进行多个案例研究,案例研究只能由一个用户撰写);案例研究必须始终有一个用户创作它。我遇到的问题是当我在我的用户控制器上调用destroy方法删除用户时,它不起作用,因为在DB中有一些案例研究让该用户与它们相关联并且我遇到了外键约束违规

我正试图找出解决这个问题的最佳方法。我以为我可以创建一个名为“已删除用户”的用户,以便在删除作者时分配案例研究。永远不会在数据库中删除或修改此“已删除的用户”。您也无法以“已删除用户”身份登录系统。

我不知道这是否会被视为不良做法,我也认为可能存在可扩展性问题。例如,如果用户有5,000个与之关联的案例研究并且该用户被删除,我怀疑在DB中更改5,000行以附加“已删除用户”用户需要很长时间。

我正在使用Sentinel管理不同级别的用户权限,因此当删除用户时,我还会将该用户与其在role_users数据透视表中的相应角色分离。

我不知道它是否有用,但这是我在UsersController上的销毁功能:

public function destroy($id)
{
    $user = User::findOrFail($id);
    $user->delete();

    $role = Sentinel::findById($id)->roles()->first();
    $role->users()->detach($id);

    Helpers::flash('The user has been successfully deleted.');
    return redirect(route('admin.users.index'));
}

这是我的迁移:

    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('email');
        $table->string('password');
        $table->text('permissions')->nullable();
        $table->timestamp('last_login')->nullable();
        $table->string('first_name')->nullable();
        $table->string('last_name')->nullable();
        $table->rememberToken();
        $table->timestamps();

        $table->engine = 'InnoDB';
        $table->unique('email');
    });


    Schema::create('studies', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title', 150);
        $table->string('problem');
        $table->string('solution');
        $table->string('analysis');
        $table->string('slug');
        $table->boolean('draft');
        $table->integer('user_id')->unsigned();
        $table->timestamps();

        // Foreign key constraints
        $table->foreign('user_id')->references('id')->on('users');

    });

1 个答案:

答案 0 :(得分:0)

在您的sentinel的迁移文件中,user_id应该是users表的外键。

我假设你所有列的底部都创建了外键约束。只需将其与->onDelete('cascade')链接即可。如果用户被删除,它将删除与用户关联的所有案例研究。

您的外键代码应如下所示:

 Schema::table('sentinels', function ($table) {
      $table->increments('id');
      $table->integer('user_id')->unsigned();
      $table->.....
      $table->.....

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

在数据库迁移之前执行此操作。如果已迁移,则在命令行上运行php artisan migrate:rollback。   编辑迁移文件,然后再次在命令提示符php artisan migrate

中迁移运行此代码的数据库