Symfony + Doctrine - можно ли связать более 2 таблиц / моделей вместе? - PullRequest
0 голосов
/ 11 февраля 2010

Я создал модель sfGuardUserProfile, которая имеет отношение к модели sfGuardUser. Затем я определяю другую модель с отношением к sfGuardUserProfile. Я не получаю никаких ошибок при создании базы данных, но когда я пытаюсь сохранить данные в sfGuardUserProfile в моем файле действий, я получаю эту ошибку:

SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется

В моем schema.yml я определяю отношения как один к одному.

Я не уверен, почему это не получится. Разве Doctrine просто не поддерживает добавление новых отношений в модель, которая уже имеет отношения?

Редактировать Вот мой schema.yml:

sfGuardUserProfile:
  tableName: sf_guard_user_profile
  columns:
    sf_guard_user_id: { type: integer(4) }
    email:            { type: string(255) }
  relations:
    User:
      class:        sfGuardUser
      type:         one
      foreignType:  one
      onDelete:     CASCADE
      local:        sf_guard_user_id
      foreign:      id
      foreignAlias: Profile

FacebookAccount:
  tableName: facebook_account
  columns:
    user_id: { type: integer(4) }
    page_id: { type: integer }
  relations:
    sfGuardUserProfile:
      type:         one
      foreignType:  one
      class:        sfGuardUserProfile
      local:        user_id
      foreign:      sf_guard_user_id
      onDelete:     CASCADE
      foreignAlias: FacebookAccount

Я сталкиваюсь с ошибкой, когда я делаю это:

$profile = $this->getUser()->getProfile();
$profile->setEmail('someone@somewhere.com');
$profile->save();

Сгенерированный SQL:

INSERT INTO sf_guard_user_profile (sf_guard_user_id, email) VALUES (?, ?) - (1, someone@somewhere.com)

Точная ошибка:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`site`.`sf_guard_user_profile`, CONSTRAINT `sf_guard_user_profile_sf_guard_user_id_facebook_account_user_id` FOREIGN KEY (`sf_guard_user_id`) REFERENCES `facebook_account` (`user_id`))

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Я думаю, что ваша проблема в том, что ваша модель FacebookAccount не связана с первичным ключом модели вашего профиля, а Doctrine не знает, как с ним работать. Измените учетную запись Facebook, указав первичный ключ профиля:

  relations:
    sfGuardUserProfile:
      type:         one
      foreignType:  one
      class:        sfGuardUserProfile
      local:        user_id
      foreign:      id
      onDelete:     CASCADE
      foreignAlias: FacebookAccount

или относится к первичному ключу sfGuardUser:

  relations:
    sfGuardUser:
      type:         one
      foreignType:  one
      class:        sfGuardUser
      local:        user_id
      foreign:      id
      onDelete:     CASCADE
      foreignAlias: FacebookAccount
1 голос
/ 11 февраля 2010

Вы должны убедиться, что не нарушаете целостность базы данных: http://msdn.microsoft.com/en-us/library/ms175464.aspx. Вы можете достичь этой вставки строк в правильном порядке, например:

$sfGuardUser = new sfGuardUser();
$sfGuardUser->id = 1;
$sfGuardUser->save();

$sfGuardUserProfile = new sfGuardUserProfile();
$sfGuardUserProfile->user_id = $sfGuardUser->id;
$sfGuardUserProfile->save();

или как это:

$sfGuardUser = new sfGuardUser();
$sfGuardUser->id = 1;

$sfGuardUserProfile = new sfGuardUserProfile();
$sfGuardUserProfile->User = $sfGuardUser;
sfGuardUserProfile->save();
...