使用Mysql无法在Laravel中创建外键

时间:2018-05-20 19:10:48

标签: php mysql laravel laravel-5 eloquent

我有一个项目,我在命令提示符的第一个命令中调用了这两个命令:

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.

注意:我会测试一些方法,例如设置两个字段的索引,...

4 个答案:

答案 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(){ ... }