所以我在本地使用我的项目并运行此代码php artisan migrate
一切正常,我的表格将被创建
但是当我移动到我的vps并做同样的事情时我得到了这个错误
[照亮\数据库\ QueryException] SQLSTATE [HY000]:常规错误:1215无法添加外键约束(SQL :alter table
mediables
添加约束mediables_media_id_foreign
forei gn key(media_id
)在删除级联上引用media
(id
)
我遵循了这个网站的一些解决方案,但他们没有工作
我的迁移文件:
Schema::create('media', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->nullable();
$table->string('old_name')->nullable();
$table->text('desc')->nullable();
$table->string('category')->nullable();
$table->string('type');
$table->string('format');
$table->string('href');
$table->string('thumbnail')->nullable();
$table->timestamps();
});
Schema::create('mediables', function (Blueprint $table) {
$table->integer('media_id')->nullable();
$table->integer('mediable_id');
$table->string('mediable_type');
$table->primary(['media_id','mediable_id','mediable_type']);
$table->timestamps();
});
Schema::table('mediables', function (Blueprint $table) {
$table->foreign('media_id')
->references('id')->on('media')
->onDelete('cascade');
});
请注意,我的项目中的媒体和其他模型之间存在多态关系
我的本地机器和我的vps之间的唯一区别是我在本地使用apache而在vps上有nginx如果它是相关的
答案 0 :(得分:2)
media
表应包含id
列,因为media_id
引用了该列。
此外,如果id
为increment()
,则应使用unsigned()
外键:
$table->integer('media_id')->unsigned()->nullable();
答案 1 :(得分:1)
如果您正在使用新的WAMP,请关注它的mysql,因为默认情况下即使在非现有列之间也会接受任何关系,例如
$table->foreign('media_id')
->references('id')->on('media')
->onDelete('cascade');
id
表格中不存在media
。
同样$table->primary(['media_id','mediable_id','mediable_type']);
将无法运行,因为您已经设置了主要id
,因为$table->increments('id');
会将id
设置为主要内容。
答案 2 :(得分:1)
默认情况下,您必须将表格引擎设置为InnoDB
,或使用
$table->engine = 'InnoDB';
只有InnoDB
引擎处理外键约束。