我有一个项目,我在命令提示符的第一个命令中调用了这两个命令:
php artisan make:model Music -m
php artisan make:model Artist -m
然后我在音乐迁移文件中创建一个外键,如下所示:
public function up()
{
Schema::create('musics', function (Blueprint $table) {
$table->increments('id');
$table->integer('artist_id')->unsigned();
$table->timestamps();
$table->foreign('artist_id')->references('id')->on('artists');
});
}
现在,我运行的迁移命令如下:
php artisan migrate
但我有一个错误:
Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `musics` add constraint `musics_artist_id_foreign` foreign key (`artist_id`) references `artists` (`id`) on delete cascade)
at D:\sites\laravel\MrMusic\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
660| // If an exception occurs when attempting to run a query, we'll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database's errors.
663| catch (Exception $e) {
> 664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|
Exception trace:
1 PDOException::("SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint")
D:\sites\laravel\MrMusic\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
2 PDOStatement::execute()
D:\sites\laravel\MrMusic\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
Please use the argument -v to see more details.
注意:我会测试一些方法,例如设置两个字段的索引,...
答案 0 :(得分:0)
订购问题。您必须先创建artists
表。 musics.artist_id
无法引用尚不存在的密钥:
php artisan make:model Artist -m
php artisan make:model Music -m
答案 1 :(得分:0)
确保artists
表迁移在musics
迁移之前运行。你什么都不能做外键!
另外,确保两个表上的列完全相同,换句话说,在这种情况下,外键列和原始主键都必须都是无符号整数。
最后,在定义外键约束时包含onUpdate()和onDelete()方法是一种更好的做法,这使得以后更容易调试/读取。
在你的情况下你会这样做:
$table->foreign('artist_id')->references('id')->on('artists')->onUpdate('cascade')->onDelete('cascade');
答案 2 :(得分:0)
您首先应该有一个艺术家表,然后是外国艺术家ID。 首先尝试创建一个艺术家模型。
答案 3 :(得分:0)
我在创建迁移文件时没有任何错误。
我的错误在于 为艺术家模型中的幻影创建功能 :
在我使用的 Artist.php 中:
public function music(){ ... }
现在我忘记这样设置:
public function musics(){ ... }