【问题标题】:Doctrine fixtures - circular references教义固定装置 - 循环引用
【发布时间】:2010-09-23 11:47:00
【问题描述】:

有没有办法加载具有循环引用的夹具?例如,我有以下夹具:

BusinessEntityTeam:
  Nicole_Team:
    name: Nicole's Team
    Manager: [Nicole]
    Business: [ACMEWidgets]

sfGuardUser
  Nicole:
    first_name:     Nicole
    last_name:      Jones
    email_address:  nicole@example.com
    username:       nicole
    password:       nicole
    Groups:         [Group_abc]
    Team:           [Nicole_Team]

如您所见,Nicole_Team 引用了 Nicole...但 Nicole 也引用了 Nicole_Team。

当 Manager 不是必需的列时,这没问题(已加载夹具,但 Manager 为 NULL),但现在它是必需的,无法加载夹具。

我能看到的唯一解决方法是将团队关系放在它自己的对象中(例如“配置文件”),这样关系就不再是循环的了。

还有其他方法吗?每个用户都必须在一个团队中,但只有少数用户是团队经理。我对我的数据模型可能设计得很糟糕并且还有改进的余地这一事实持开放态度。

【问题讨论】:

    标签: symfony1 schema doctrine fixtures


    【解决方案1】:

    这个怎么样:

    BusinessEntityTeam:
      Nicole_Team:
        name: Nicole's Team
        Business: [ACMEWidgets]
    
    sfGuardUser
      Nicole:
        first_name:     Nicole
        last_name:      Jones
        email_address:  nicole@example.com
        username:       nicole
        password:       nicole
        Groups:         [Group_abc]
        Team:           [Nicole_Team]
        ManagerFor:     [Nicole_Team]
    

    为了避免循环引用,您必须将关系放在一个模型中。

    【讨论】:

    • 感谢您的回答。我尝试了这一点,在 BusinessEntityTeam 和 sfGuardUser 之间添加了双向关系,以便建立引用关系。夹具加载时没有抛出错误,但值仍然为 NULL
    • 为什么要添加双向关系?我所做的就是避免这种关系。如果你想了解一个团队的经理,你必须在你的团队模型中编写一个方法。例如函数 getManager() 并自己实现该方法。 sql 应该类似于“从用户 u 中选择前 1 个,其中 u.manager_for = ?”
    • 我犯了一个错误。您不需要自己编写 getManager() 方法。而且您也不需要添加双向关系。这种关系是自动双向的。例如,您添加从 User 到 Team 的关系,那么您有两个方法:user->getTeam() 和 team->getUsers() 自动。对于您的示例:将有两种方法 user->getManagedTeam() 和 team->getManager()。我必须阅读你的 schema.xml 才能告诉你更多细节。
    • 你写的听起来是对的,但在我的情况下仍然不起作用。我认为这是因为我在所有表之间有很多循环/引用,并且还有其他依赖项没有解决。因此,我将此标记为正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多