Php 自动填充外键行
我正在尝试使用laravel为一个项目创建一个登录/注册系统,由于这是我第一次,我遇到了很多麻烦,所以我请求原谅我犯的任何极其愚蠢的错误 我已经成功地向默认注册屏幕添加了一个新的自定义字段,但在我修改的用户表中,我还有两个外键引用其他表(“gameInfo\u id”指“gameInfo”表,“role\u id”指“roles”表) 这就是我得到的错误: 这是否意味着我必须找到一种自动填写外键的方法?如果是的话,我将如何着手做这件事? 我在谷歌上搜索了一下,发现这似乎是个问题,但我从未找到明确的解决方案 谢谢大家! 以下是我在用户表中的迁移:Php 自动填充外键行,php,mysql,laravel-5,Php,Mysql,Laravel 5,我正在尝试使用laravel为一个项目创建一个登录/注册系统,由于这是我第一次,我遇到了很多麻烦,所以我请求原谅我犯的任何极其愚蠢的错误 我已经成功地向默认注册屏幕添加了一个新的自定义字段,但在我修改的用户表中,我还有两个外键引用其他表(“gameInfo\u id”指“gameInfo”表,“role\u id”指“roles”表) 这就是我得到的错误: 这是否意味着我必须找到一种自动填写外键的方法?如果是的话,我将如何着手做这件事? 我在谷歌上搜索了一下,发现这似乎是个问题,但我从未找到明
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中创建一个新行,gameInfo\u id外键将引用该行。如果用户表已经包含数据集,其中一些数据集没有现有的
gameInfo\u id
或role\u id
,则默认情况下,此新创建行的列可以设置为0。如果用户表已经包含数据集,则不能向表中添加外键约束。
在添加外键约束之前,表必须处于有效状态
这意味着:向现有字段添加新的外键约束不是最好的主意。无论如何,你必须先修复完整性
如果您仍在开发环境中,解决此问题的最佳方法是重新开始使用migrate:refresh
。
如果系统在有用户的生产环境中运行,则必须修复所有具有无效或未设置的
gameInfo\u id
和role\u id
的用户。如果你只有几个用户,你可以手工操作。如果您有许多用户,您可以在迁移脚本中执行一些操作(在添加fk约束之前,对所有用户进行迭代并添加缺少的引用)。我会采用另一种方法。
我会在gameInfo表中用一个user_id列引用该用户。
这样,用户就拥有许多gameInfo,而gameInfo属于用户。因为游戏信息在用户创建之前没有创建,并且已经玩过游戏
这有意义吗?因为->nullable()似乎没有被laravel识别,所以我决定为gameInfo中的每一列指定一个默认值0,这对我来说也很好
另一方面,扭转用户和gameInfo之间的FK关系也起到了作用,所以我的问题得到了解决
非常感谢你们的回答,非常感谢你们的每一个贡献 您的错误仅仅意味着您为“gameInfo\u id”或“role\u id”提供的值在其引用的表中不存在。gameInfo表中是否有任何数据?@Shadow none,no,gameInfo是用户在我们制作的游戏中获得的分数表。我试图做到的是,当一个新用户注册一个帐户时,它会在gameInfo中创建一个新行,gameInfo\u id外键将引用该行。默认情况下,此新创建行的列可以设置为0。如果有帮助,则不应将其设置为0,应将其设置为null。我不是拉威尔的专家。是不是
$table->integer('gameInfo_id')->unsigned()代码>代码生成一个没有默认值的可空字段?是的,这对我来说很有意义:)我首先要尝试一下评论中给我的一些选项,然后我可能还会实现你的建议,谢谢!