Symfony FK Ограничение Выпуск - PullRequest
0 голосов
/ 24 мая 2010

Итак, у меня есть схема таблицы, в которой есть пользователи, которые могут быть друзьями.

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;

Может быть, это поможет!

Спасибо!

1 Ответ

2 голосов
/ 24 мая 2010

Назовите отношения в вашей таблице 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}
...