Symfony + Doktrin - birlikte mümkün fazla 2 tablo / modelleri bağlamak için?

2 Cevap php

Ben sfGuardUser model bir ilişkisi olan bir sfGuardUserProfile modeli oluşturduk. Sonra sfGuardUserProfile bir ilişkisi olan başka bir model tanımlar. Ben veritabanı oluşturmak zaman herhangi bir hata alamadım, ama benim eylemleri dosyasında sfGuardUserProfile verileri kaydetme çalıştığınızda bu hatayı alıyorum:

Sqlstate [23000]: Bütünlük kısıtlaması ihlali: 1452 bir alt satır eklemek veya güncellemek olamaz: Bir yabancı anahtar kısıtlaması başarısız

Benim schema.yml, ben 1-1 olarak ilişkileri tanımlama.

Ben bu başarısız olacağını neden emin değilim. Doktrin sadece zaten bir ilişkisi olan bir model, yeni bir ilişki eklemeyi desteklemez?

Edit Here's my 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

Ben bunu yaparken ben hatayla karşılaşırsanız:

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

Oluşturulan SQL:

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

Tam hata:

Sqlstate [23000]: Bütünlük kısıtlaması ihlali: 1452 bir alt satır eklemek veya güncellemek olamaz: Bir yabancı anahtar kısıtlaması başarısız (`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 Cevap

Senin sorun FacebookAccount modeli Profili modeli üzerinde birincil anahtar bağlantı değildir ve Doktrin onunla çalışmak nasıl bilmeden olduğunu düşünüyorum. Profili birincil anahtara başvuruda için FacebookAccount değiştirin ya:

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

veya sfGuardUser birincil anahtarına ilgilidir:

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

Eğer veritabanı bütünlüğünü bozmazlar sağlamak zorundayız: http://msdn.microsoft.com/en-us/library/ms175464.aspx. Örneğin, doğru sırayla bu satırları ekleyerek ulaşabilirsiniz:

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

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

ya da bunun gibi:

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

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