2010-05-19 10 views
8

Tengo un modelo de archivos y varios (actualmente 3) diferentes otros modelos (artículo, trabajo, evento) que pueden tener todos los archivos almacenados en el modelo de archivos.Doctrine: varios modelos que hacen referencia al mismo campo de ID en otro modelo

El problema es que cuando me generan las tablas a través de la CLI-Herramienta (./doctrine acumulación de todo recarga), me sale este mensaje de error:

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`)) 

del archivo se define como (No son las relaciones definido en este modelo definido):

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

Los 4 modelos tienen esta relación definición:

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

T suyo es el código PHP que genera Doctrina (BaseFile.php):

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

entiendo por qué esto sucede (Las restricciones no se pueden configurar para múltiples mesas), pero no tienen idea de cómo podría resolver este problema sin varias tablas de archivos o una tabla de asociación.

¿Hay alguna manera de decirle a Doctrine que no debe crear las relaciones en el modelo de archivo?

¿Alguna buena idea?

+0

¿Puedo preguntar por qué no lo resuelve utilizando una tabla de asociación? Es una solución muy flexible y eficiente, ya que le permitirá vincular el mismo archivo a diferentes tipos de contenido sin cargarlo varias veces. Con su modelo actual esto es imposible ... – wimvds

+0

¿Podría realmente resolver esto con una tabla de asociación? ¿Cómo dejaré que la doctrina sepa sobre el campo "tipo"? – smoove

+0

No sé cómo hacer que esto suceda con la doctrina, pero el problema probablemente radique en que la doctrina agregue una tabla que depende de otra tabla ** antes ** de que se haya creado otra tabla. –

Respuesta

0

tratar si es necesario,
relaciones:

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

Usted puede intentar algo como:

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

modelo de archivos necesita saber la ID y el modelo de entrada enlazada. Así, en Files.class.php también puede especificar:

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

Probablemente hay una manera mejor, pero en este caso se han 1 mesa, que no es necesario ningún más relaciones, pero hay que especificar captadores/setters por ti mismo. Por lo tanto, depende de sus objetivos, ya sea que esto vaya o no.

Cuestiones relacionadas