Symfony + Doctrine - 可以将超过2个表格/模型链接在一起吗?

时间:2010-02-11 18:04:01

标签: php symfony1 doctrine sfguard

我创建了一个与sfGuardUser模型有关系的sfGuardUserProfile模型。然后我定义另一个与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 个答案:

答案 0 :(得分:2)

我认为您的问题是您的FacebookAccount模型没有链接到您的个人资料模型上的主键,而且Doctrine不知道如何使用它。更改您的FacebookAccount以引用配置文件主键:

  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 :(得分:1)

您必须确保不破坏数据库完整性: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();