我在stackOverflow上看到了很多关于我的错误的问题,但由于某种原因,答案不适用于以下内容:
我有三张表如下:
public function up()
{
Schema::create('activities_nl', function(Blueprint $table){
$table->increments('id');
$table->integer('activity_id')->unique();
$table->string('title');
$table->string('location');
$table->string('price');
$table->string('age_indication')->nullable();
$table->longText('registration')->nullable();
$table->longText('mandatory')->nullable();
$table->longText('description')->nullable();
$table->string('special_title')->nullable();
$table->string('academy')->nullable();
$table->timestamps();
$table->integer('en_table')->nullable();
$table->integer('de_table')->nullable();
});
}
public function up()
{
Schema::create('activities_de', function(Blueprint $table){
$table->increments('id');
$table->integer('activity_id')->unique();
$table->string('title');
$table->string('location');
$table->string('age_indication')->nullable();
$table->string('price');
$table->longText('registration')->nullable();
$table->longText('mandatory')->nullable();
$table->longText('description')->nullable();
$table->string('special_title')->nullable();
$table->string('academy')->nullable();
$table->timestamps();
$table->integer('nl_table')->nullable();
$table->integer('en_table')->nullable();
});
}
public function up()
{
Schema::create('activities_en', function(Blueprint $table){
$table->increments('id');
$table->integer('activity_id')->unique();
$table->string('title');
$table->string('location');
$table->string('age_indication')->nullable();
$table->string('price');
$table->longText('registration')->nullable();
$table->longText('mandatory')->nullable();
$table->longText('description')->nullable();
$table->string('special_title')->nullable();
$table->string('academy')->nullable();
$table->timestamps();
$table->integer('nl_table')->nullable();
$table->integer('de_table')->nullable();
});
}
我尝试连接它们不是increments('id')
而是integer('activity_id)
。以下是连接外键的迁移。
public function up()
{
Schema::table('activities_nl', function(Blueprint $table){
$table->foreign('en_table')->references('activity_id')->on('activities_en');
$table->foreign('de_table')->references('activity_id')->on('activities_de');
});
Schema::table('activities_de', function(Blueprint $table){
$table->foreign('en_table')->references('activity_id')->on('activities_en');
$table->foreign('nl_table')->references('activity_id')->on('activities_nl');
});
Schema::table('activities_en', function(Blueprint $table){
$table->foreign('nl_table')->references('activity_id')->on('activities_nl');
$table->foreign('de_table')->references('activity_id')->on('activities_de');
});
}
出于某种原因,我一直得到一个外键约束..是不是因为laravel不喜欢我试图引用不同的ID?如果是的话,是否有解决方法..
或者它只是一个我忽略的拼写错误?
编辑:对于所有应该是外来的列,从unsignedInteger更改为只是整数。
编辑:添加 - > nullable()到activity_id
所以它与其他列完全相同
答案 0 :(得分:1)
问题是activity_id被定义为整数,就像持有外键的字段被定义为无符号整数一样。这是一种类型不匹配。所有字段都应定义为整数或无符号整数。
请参阅foreign keys上的mysql文档:
外键和引用键中的对应列必须具有相似的数据类型。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。
此外,您需要在引用和引用字段上创建索引,以便设置外键。 Mysql仅在引用字段上创建索引(如果不存在):
MySQL需要外键和引用键上的索引,以便外键检查可以快速而不需要表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为第一列。如果索引不存在,则会自动在引用表上创建这样的索引。