在Laravel播种时改变数据

时间:2014-03-26 08:21:32

标签: php laravel seeding

为这个例子道歉,这是我能想到的最好的。

情景

我正在构建一个Laravel 4.1应用程序,我在一个名为people的数据库中有两个表houseshogwarts

people包括学生,工作人员,鬼魂,吉祥物等等,因此有house_id的外键将每个人与房子联系起来。每个房子都有一个房子的头部,所以有head_id将房子连接回一个人。

这会创建一个外键循环,阻止每个表被播种,直到另一个表被播种,所以我选择做的是允许head_id表上的houses可以为空。 / p>

这意味着我可以先在房屋的桌子上播种,不设置房屋的头部,然后与每个与房屋相关的人种下人员桌。

问题

问题是我现在需要指定另一个种子来改变houses表,以便为每个房子设置head_id,但我找不到告诉你如何更新现有数据的地方在种子内。

1 个答案:

答案 0 :(得分:0)

您描述的数据库结构会创建一个循环依赖项,导致您描述的问题,循环依赖本身没有任何根本错误,但在与DBMS外部的数据交互时可能会导致约束违规。

因此,我建议在数据库中添加第三个表来抽象人与房屋之间的关系,其中可能包含一个布尔字段,表明某人是否是房屋负责人

然后,您可以向新表添加唯一约束:

一个穿过house_id和一个新的布尔字段以确保每个房子只有一个头

更新:上述约束不起作用,因为(house_id,true)将是唯一的一次,但是你将与许多(house_id,false)值重复。

如果你将head_id留在house表中,那么你可以先在people表中播种,当你为house表播种时,你可以添加head person的id,而不会违反关系,因为它不再是循环的。

然后,您可以播种第三个表格,将人们联系到解决循环依赖问题的房屋。

您可以在新表中的person_id上添加唯一约束,以确保某人只能是一个人的成员,或者您可以在业务逻辑中处理这些规则。