自动填写外键行

时间:2017-04-20 12:14:53

标签: php mysql laravel-5

我正在尝试使用laravel为项目创建登录/注册系统,因为这是我的第一次,我遇到了很多麻烦,所以我&#39我请你原谅我所犯的任何非常愚蠢的错误。

我已经成功将新的自定义字段添加到默认注册屏幕,但在我的修改后的用户表中,我还有两个引用其他表的外键(' gameInfo_id'指的是& #39; gameInfo'表格和' role_id'指的是'角色'表格)

这是我得到的错误: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails

这是否意味着我必须找到一种方法来自动填写外键?如果是这样,我该怎么做呢? 我做了一些谷歌搜索,发现这通常似乎是问题,但我从来没有找到明确的解决方案。

谢谢!

这是我在users表中的迁移:

      Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('firstName');
        $table->string('lastName');
        $table->string('email')->unique;
        $table->string('password');
        $table->integer('gameInfo_id')->unsigned();
        $table->integer('role_id')->unsigned();
        $table->timestamps();
    });

    Schema::table('users', function($table) {
        $table->foreign('gameInfo_id')->references('id')->on('gameInfo');
        $table->foreign('role_id')->references('id')->on('roles');
    });
游戏信息是用户在我们正在制作的游戏中将获得的分数表。我尝试制作的是,当新用户注册帐户时,它会在gameInfo中创建一个新行,gameInfo_id外键将引用该行。如果有帮助

,则默认情况下,此新创建的行的列可以设置为0

3 个答案:

答案 0 :(得分:1)

我会反过来做。 我将使用user_id列在gameInfo表中引用用户。 这样,用户拥有许多gameInfo,而gameInfo属于用户。由于在创建用户之前没有创建游戏信息,并且已经玩过游戏。

这有意义吗?

答案 1 :(得分:0)

如果users表已包含数据集,其中有些数据集不存在gameInfo_idrole_id,则无法向表中添加外键约束。 在添加外键约束之前,表必须处于有效状态。

这意味着:向现有字段添加新的外键约束并不是最好的主意。无论如何,你必须先修复完整性。

如果您仍处于开发环境中,解决此问题的最佳方法是使用migrate:refresh重新开始。 如果系统与用户一起投放生产,则必须修复所有无效或未设置gameInfo_idrole_id的用户。如果你只有几个用户,你可以手动完成。如果你有很多用户,你可以在迁移脚本中做一些魔术(在添加fk约束之前迭代所有用户并添加缺少的引用)。

答案 2 :(得分:0)

由于 - > nullable()似乎没有被laravel识别,我改为决定给gameInfo中的每一列默认值为0,这对我来说也很合适。

另一方面,扭转用户和gameInfo之间的FK关系也有效,所以我的问题已经解决了!

非常感谢你们的回答,我们非常感谢所有的贡献!