【问题标题】:Symfony FK Constraint IssueSymfony FK 约束问题
【发布时间】:2011-02-23 00:16:22
【问题描述】:

所以我有一个表架构,其中包含可以成为朋友的用户。

User:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true }
    email: { type: string(255), notnull: true, unique: true }
    nickname: { type: string(255), unique: true }
    password: { type: string(300), notnull: true }
    image: { type: string(255) }

FriendsWith:
  actAs: { Timestampable: ~ }
  columns:
    friend1_id: { type: integer, primary: true }
    friend2_id: { type: integer, primary: true }
  relations:
    User: { onDelete: CASCADE, local: friend1_id, foreign: id }
    User: { onDelete: CASCADE, local: friend2_id, foreign: id }

它可以正确构建数据库,但是当我尝试插入测试数据时:

User:
  user1:
    name: Danny Gurt
    email: comy19@gmail.com
    nickname: danny
    password: test1
  user2:
    name: Adrian Soian
    email: adriansoian@gmail.com
    nickname: adrian
    password: test1

FriendsWith:
  friendship1:
    friend1_id: user1
    friend2_id: user2

我遇到了这个完整性约束问题:

  SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`krowdd`.`friends_with`, CONSTRAINT `friends_with_ibfk_1` FOREIGN KEY (`friend1_id`) REFERENCES `user` (`id`) ON DELETE CASCADE)  

有什么想法吗?

补充:

我注意到生成的 sql 代码只显示了 friends_with 表的一个约束:

ALTER TABLE friends_with ADD CONSTRAINT friends_with_friend2_id_user_id FOREIGN KEY (friend2_id) REFERENCES user(id) ON DELETE CASCADE;

也许这会有所帮助!

谢谢!

【问题讨论】:

    标签: php mysql symfony1 doctrine yaml


    【解决方案1】:

    以不同的方式命名 FriendsWith 表中的关系,以便 Doctrine 可以正确使用它们:

    relations:
      User1:   { onDelete: CASCADE, local: friend1_id, foreign: id, foreignAlias: Friend1 }
      User2:   { onDelete: CASCADE, local: friend2_id, foreign: id, foreignAlias: Friend2 }
    

    这些数字可能不是关系的最佳名称,但你明白了。

    更新 - 代码:

    这应该为您完成工作 - 请注意,我在 User 表中添加关系,而不是 FriendsWith 表:

    relations:
      Friend1:  {class: FriendsWith, local: id, foreign: friend1_id, type: many, foreignType: one, foreignAlias: User1, onDelete: CASCADE}
      Friend2:  {class: FriendsWith, local: id, foreign: friend2_id, type: many, foreignType: one, foreignAlias: User2, onDelete: CASCADE}
    

    【讨论】:

    • 仍然没有解决问题。顺便说一句,这两个表都需要称为 User,因为它们引用了实际的表名。我仍然得到与以前相同的 sql 错误。不过我确实注意到了一些奇怪的事情。当我检查生成的 sql 代码时,为 friends_with 表创建的约束只有一个,而应该有两个。我将在我的原始帖子中发布代码。
    • 还有一个名为“class”的附加属性,您可以使用它来指定与其相关的模型。设置它以指示正确的表,然后重命名关系。我遇到了完全相同的问题,完全相同的情况,完全相同的问题。使用上述方法。如果你不能让它工作,请告诉我,我会把我的代码发布给你。
    • 嗨,汤姆。谢谢你的帮助,但我还是有点困惑。如果您可以发布您的代码,那将非常有帮助。再次感谢!
    • 试试...上面发布的代码。该关系现在在 User 模型下定义。
    • 我试过了,它创建了正确的 sql 代码,但是当它尝试插入时我仍然得到这个:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 (krowdd.friends_with, CONSTRAINT friends_with_friend1_id_user_id FOREIGN KEY (friend1_id) REFERENCES user (id))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多