在laravel中使用外键种子数据时数据库种子错误

时间:2014-02-05 13:08:06

标签: php database foreign-keys laravel-4 foreign-key-relationship

当我播种数据时,表中存在外键然后发生以下错误..我无法解决这个问题,我怎么解决?

[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update   
a child row: a foreign key constraint fails (`doctodoor2014`.`staffs`,
CONSTRAINT `staffs_specialty_id_foreign` FOREIGN KEY (`specialty_id`) REFERENCES
specialties` (`id`)) (SQL: insert into `staffs` (`id`, `first_name`, `last_name`)
values (1, Admin, Admin))  

我可以用外键播种表吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以使用外键播种。您只需要在插入子项之前确保父项存在。 查看有问题的两个表的内容,看看您尝试插入的给定子ID是否存在父ID。

我发现我的问题是我每次运行种子类时,父表的id会增加。因为我的子表插入具有硬编码的id,所以我会得到参照完整性错误。

作为一种快速解决方法,您可以删除数据库并重新创建它,这将重置所有自动增量ID。

当然,最好修复种子定义。我通过将子表中的硬编码ID替换为实际的父ID来执行此操作,如下所示:

//,'user_id'=>1 
  ,'user_id'=>User::first()->id 

为了帮助调试 - 在每个种子类的开头和结尾添加echo语句,以帮助查看错误的位置。

public function run() {
  echo PHP_EOL.'QuestionTableSeeder BEGIN'.PHP_EOL;
  $test_id = Test::first()->id;
  echo PHP_EOL."test_id:'" . $test_id. "'";

  ...
  echo PHP_EOL.'QuestionTableSeeder END'.PHP_EOL;
}

让我感到震惊的另一件事是我在打电话:

  User::first()->id

返回一个空字符串。 事实证明,它实际上意味着:

  User::first()->user_id

该表是由另一位开发人员创建的,他没有遵循将主键命名为id!

的惯例