【问题标题】:Altering data when seeding in Laravel在 Laravel 中播种时更改数据
【发布时间】:2014-05-04 12:10:43
【问题描述】:

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

情景

我正在构建一个 Laravel 4.1 应用程序,我在名为 hogwarts 的数据库中有 2 个表,peoplehouses

people 包括学生、工作人员、鬼魂、吉祥物等,所以有一个外键house_id 将每个人与一个房子联系起来。每个房子都有一个房子的负责人,所以有一个head_id 将房子与一个人联系起来。

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

这意味着我可以先播种房屋表,没有设置房屋的负责人,然后将与他们房屋相关的每个人播种到人员表。

问题

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

【问题讨论】:

    标签: php laravel seeding


    【解决方案1】:

    您描述的数据库结构创建了导致您描述的问题的循环依赖关系,循环依赖关系本身并没有根本性的问题,但在与来自 DBMS 外部的数据交互时可能会导致违反约束。

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

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

    一个跨越 house_id 和新的布尔字段,以确保每个房子只有一个人头

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

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

    然后您可以播种第三张表以将人与房屋相关联,从而解决循环依赖问题。

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

    【讨论】:

    • 谢谢 Steven 我将采用这个解决方案。 :)
    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多