0

sfGuardUser モデルと関係のある sfGuardUserProfile モデルを作成しました。次に、sfGuardUserProfile に関連する別のモデルを定義します。データベースを作成するときにエラーは発生しませんが、アクション ファイルの sfGuardUserProfile にデータを保存しようとすると、次のエラーが発生します。

SQLSTATE [23000]: 整合性制約違反: 1452 子行を追加または更新できません: 外部キー制約が失敗しました

私の schema.yml では、関係を 1 対 1 として定義しています。

なぜこれが失敗するのかわかりません。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`))
4

2 に答える 2

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
于 2010-02-12T00:50:59.753 に答える
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();
于 2010-02-11T20:10:16.773 に答える