2010-05-19 4 views
8

Ich habe ein Filemodell und mehrere (derzeit 3) verschiedene andere Modelle (Artikel, Job, Ereignis), die Dateien enthalten können, die im Dateimodell gespeichert sind.Doktrin - Mehrere Modelle, die auf dasselbe ID-Feld in einem anderen Modell verweisen

Das Problem ist, dass, wenn ich die Tabellen über das CLI-Tool (./doctrine build-all-reload) erzeugen, ich diese Fehlermeldung:

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

Datei definiert ist (keine Beziehungen definiert definiert in diesem Modell):

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

Alle 4 Modelle haben diese Beziehung-Definition:

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

T ies ist die Php-Kodex, dass Lehre erzeugt (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')); 
} 

Ich verstehe, warum dies geschieht (Die Einschränkungen nicht Setup für mehrere Tabellen sein können), haben aber keine Ahnung, wie ich dieses Problem lösen könnte Problem ohne verschiedene Dateitabellen oder eine Zuordnungstabelle.

Gibt es eine Möglichkeit, Doctrine mitzuteilen, dass es die Beziehungen im Dateimodell nicht erstellen soll?

Irgendwelche guten Ideen?

+0

Könnte ich fragen, warum Sie es nicht mithilfe einer Zuordnungstabelle lösen? Es ist eine sehr flexible und effiziente Lösung, da Sie die gleiche Datei mit verschiedenen Inhaltstypen verknüpfen können, ohne sie mehrfach hochzuladen. Mit Ihrem aktuellen Modell ist das unmöglich ... – wimvds

+0

Konnte ich das wirklich mit einer Assoziationstabelle lösen? Wie würde ich die Lehre über das Feld "Typ" wissen lassen? – smoove

+0

Ich weiß nicht, wie man das mit der Doktrin machen kann, aber das Problem liegt wohl in der Doktrin, die eine Tabelle hinzufügt, die von einer anderen Tabelle abhängt ** bevor ** eine andere Tabelle erstellt wurde. –

Antwort

0

versuchen, wenn Sie benötigen,
Beziehungen:

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

Sie können wie etwas versuchen:

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

Dateien Modell die ID und das Modell der verlinkten Eintrag wissen muss. Also, in Files.class.php können Sie auch angeben:

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

Wahrscheinlich ist es eine bessere Art und Weise, aber in diesem Fall, dass Sie 1 Tisch haben, brauchen Sie keine weiteren Beziehungen, aber Sie haben Getter angeben/setter selbst. Es hängt also von deinen Zielen ab, ob das geht oder nicht.

Verwandte Themen