Doktrin - başka bir modelle aynı id alanını başvuran birden fazla model

1 Cevap php

Ben bir Dosyalar Modeli var ve Çoklu (şu anda 3) farklı diğer modelleri tüm Dosyalar Model saklanan dosyaları olabilir (Madde, İş, Olay).

Sorun i CLI-Aracı (. / Doktrin build-all-reload) üzerinden tablo oluşturmak zaman, ben bu hata mesajı almak olduğunu:

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 (yok ilişkiler tanımlanan bu Modeli tanımlandığı) olarak tanımlanır:

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

Tüm 4 Modelleri bu ilişki tanımı var:

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

Bu Doktrini (BaseFile.php) üretir Php-Code:

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'));
}

Anlıyorum why Bu durumda (Kısıtlayıcı çoklu tablolar için kurulum olamaz), ama mutltiple dosya tabloları veya bir dernek tablo olmadan bu sorunu nasıl çözebileceklerini hiçbir fikrim yok.

O Dosya modelinde ilişkileri oluşturmak gerektiğini Doktrini anlamanın bir yolu var mı?

Herhangi bir iyi bir fikir?

1 Cevap

Sen gibi bir şey deneyebilirsiniz:

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. Yani, Files.class.php yılında da belirtebilirsiniz:

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

Muhtemelen daha iyi bir yolu var, ama bu durumda 1 tablo var, daha fazla ilişki gerekmez, ama kendiniz alıcılar / ayarlayıcıları belirtmeniz gerekir. Yani bu köknar olup olmayacağı hedeflerinize bağlıdır.