2010-05-19 10 views
8

Bir Dosyalar Modeli var aynı kimliği alanını başvuran Çoklu modelleri ve çoklu (şu anda 3) Dosyalar Modeli depolanan tüm dosyaları olabilir farklı diğer Modelleri (Madde, Meslek, Olay).Doktrin - başka bir modelde

sorun i (./doctrine birikimi her reload) CLI-Aracı ile tablolar oluştururken, ben bu hata mesajını elde ediyoruz:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot 
add or update a child row: a foreign key constraint fails 
(`my_database/articles`, CONSTRAINT `articles_id_files_target_id` 
FOREIGN KEY (`id`) REFERENCES `files` (`target_id`)) 

Dosya No ilişkiler (olarak tanımlanır

columns: 
    id: 
    primary: true 
    autoincrement: true 
    type: integer(4) 
    target_id: integer(4) 
    filename: string(255) 
[...] 

4- Modeller

bu ilişki-tanıma sahiptir: tanımlanan bu model) 'de tarif

relations: 
    Files: 
     type: many 
     class: File 
     local: id 
     foreign: target_id 

T

public function setUp() 
{ 
    parent::setUp(); 
    $this->hasOne('Publication', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Event', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Article', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 

    $this->hasOne('Job', array(
     'local' => 'target_id', 
     'foreign' => 'id')); 
} 

Ben bunun neden böyle (Kısıtlamalar birden tablolar için kurulum olamaz) anlıyorum, ama ben bu nasıl çözebileceklerini hiçbir fikrim yok: onun Doktrini oluşturduğu Php-Kodu (BaseFile.php) 'dir mutltiple dosya tabloları veya bir ilişkilendirme tablosu olmadan sorun.

o Dosya modelinde ilişkilerini yaratmaması gerektiğine de Doctrine anlamanın bir yolu var mı?

Her iyi fikir?

columns: 
    id: { type: integer(4), notnull: true, primary: true, autoincrement: true } 
    target_id: { type: integer(4), notnull: true } 
    model:  { type: string, notnull: true } 

Dosyalar modeli kimliği ve bağlantılı giriş modelini bilmesi gerekir: Sen gibi bir şey deneyebilirsiniz

Files: 
    type: many 
    class: File 
    local: target_id 
    foreign: id 
Files2: 
    type: many 
    class: File 
    local: id 
    foreign: id 
+0

Neden ilişkilendirme tablosu kullanarak çözmediğinizi sorabilir miyim? Aynı dosyayı farklı içerik türlerine birden çok kez yüklemeden bağlamanızı sağlayacağından çok esnek ve verimli bir çözümdür. Mevcut modelinizle bu imkansız ... – wimvds

+0

Bunu gerçekten bir ilişki tablosuyla çözebilir miyim? "tip" alanı hakkında doktrin hakkında nasıl bilgi verebilirim? – smoove

+0

Bunu doktrinle nasıl gerçekleştireceğimi bilmiyorum, ancak problem başka bir tabloya ** başka bir tablo oluşturulduğundan ** önce başka bir masaya bağımlı bir tablo ekleyerek doktrin ile yatıyor. –

cevap

0

,
ilişkileri deneyin.

public function getArticles() { 
    if (strcmp($this->getModel(), 'Articles')) { 
     return Doctrine::getTable('Articles')->findOneById($this->getTargetId()); 
    } else { 
     return false; 
    } 
} 

Muhtemelen daha iyi bir yol var, ancak bu durumda size, daha fazla ilişki 1 masa gerekmez, ancak sen alıcılar belirtmek zorunda: Yani Files.class.php içinde de belirtebilirsiniz/kendiniz belirleyiciler. Yani bu, ister ateş olsun ister olmasın, hedeflerine bağlıdır.