我有两张桌子 - Users
和Points
。在Points
中我想要以下列:id,points,user_id(外键)。
出于此目的,我按以下顺序进行了以下操作:
创建I迁移,如下所示:
public function up()
{
Schema::create('points', function (Blueprint $table) {
$table->increments('id');
$table->integer('points')->unsigned();
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('user');
});
}
运行迁移后,出现以下错误:
[Illuminate \ Database \ QueryException] SQLSTATE [HY000]:常规错误:1005无法创建表
logos
。#sql-3da4_79a
(错误号:150 “外键约束形成错误”)(SQL:alter tablepoints
添加约束points_user_id_foreign
外键 (user_id
)引用user
(id
))[Doctrine \ DBAL \ Driver \ PDOException] SQLSTATE [HY000]:常规 错误:1005无法创建表
logos
。#sql-3da4_79a
(错误:150 “外键约束形成错误”)[PDOException] SQLSTATE [HY000]:常规错误:1005无法创建 table
logos
。#sql-3da4_79a
(错误:150“外键约束是 错误形成“)
之后,我将此关系添加到users
:
public function points()
{
return $this->hasOne('App\Points');
}
与points
的关系:
public function user()
{
return $this->hasOne('App\User', 'user_id');
}
然后我为外键添加了另一个迁移(因为上一次迁移创建了表及其列,尽管有错误):
public function up()
{
Schema::table('points', function (Blueprint $table) {
$table->foreign('user_id')->references('id')->on('user');
});
}
运行迁移后,我遇到了与第一次相同的错误。我知道错误似乎是“自我解释”,但说实话,这对我没有任何意义。我只是遵循官方文档,我不明白为什么我会收到此错误。
有人可以解释并帮我解决问题吗?
干杯!
答案 0 :(得分:2)
首先,确保在运行users
迁移之前创建points
的时间戳!
因此,用户应首先在积分之前迁移。因为在尝试声明foregin密钥之前,您要确保已经有用户表!
然后你在foreign
声明中输了一个错字
它应该是users
而不是user
,如下所示:
$table->foreign('user_id')->references('id')->on('users');