2014-06-05 5 views
6

Grund Frage:Lehre 2-Mapping Referenzierung eindeutige Schlüssel

Ist es möglich, eine Verbindung mit Lehre Referenzierung keinen primären, sondern nur einen eindeutigen Schlüssels zur Karte?

Extended Version:

Ich habe eine Entität (Participation), die kann Referenz 2 andere Entitäten (DropoutCause und DischargeType). Abhängig von dieser Kombination werden einige andere Attribute basierend auf einer anderen (4.) Tabelle (DropoutScenario) in der Datenbank impliziert. Da eine der beiden referenzierten Entitäten null sein kann, konnte ich sie nicht als primären, sondern nur eindeutigen Schlüssel in der vierten Tabelle deklarieren.

Das Problem ist, ich nur einen Fehler, wenn ich versuche, dies mit Lehre zur Karte:

Fehlender Wert für Primärschlüssel-ID auf Application \ Entity \ Training \ DropoutScenario

Am I etwas falsch machen, oder ist das mit Doctrine einfach nicht möglich? Wenn nicht, gibt es eine bessere Lösung, wie ich das tun könnte?

Ich habe jetzt eine recht lange Zeit mit der Suche und grub die Dokumentation Lehre, aber ich konnte einfach nichts dazu finden ...

Stripped Codebeispiele meiner Zuordnungen sind unten.

Teilnahme:

<?php 

namespace Application\Entity\Trainings; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\MappedSuperclass 
*/ 
abstract class Participation { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Application\Entity\DropoutCause") 
    * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="id")) 
    */ 
    protected $dropoutCause; 

    /** 
    * @ORM\ManyToOne(targetEntity="Application\Entity\DischargeType") 
    * @ORM\JoinColumn(name="discharge_id", referencedColumnName="id")) 
    */ 
    protected $dischargeType; 

    /** 
    * @ORM\ManyToOne(targetEntity="DropoutScenario") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="discharge_id", referencedColumnName="discharge_id"), 
    * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="dropout_cause_id") 
    * }) 
    */ 
    private $scenario; 

DropoutScenario:

<?php 

namespace Application\Entity\Trainings; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="training_dropout_scenarios") 
*/ 
class DropoutScenario { 

    /** 
    * @var int 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Application\Entity\DropoutCause") 
    * @ORM\JoinColumn(name="dropout_cause_id", referencedColumnName="id")) 
    */ 
    protected $dropoutCause; 

    /** 
    * @ORM\ManyToOne(targetEntity="Application\Entity\DischargeType") 
    * @ORM\JoinColumn(name="discharge_id", referencedColumnName="id")) 
    */ 
    protected $dischargeType; 

    /** @ORM\Column(type="integer", name="dropout_cause_id") */ 
    protected $dropoutCauseId; 

    /** @ORM\Column(type="integer", name="discharge_id") */ 
    protected $dischargeTypeId; 

Antwort

6

Da ich keine Antwort bekommen habe noch ich heute eine weitere Forschung tat und ich fand die Antwort auf meine eigene Frage durch die Doctrine Mailinglisten Forum. Scheint, als ob ich gerade nach den falschen Schlüsselwörtern gesucht habe ...

Doktrin 2 unterstützt es leider nicht. Was für eine Schande! :(

aus der Lehre Dokumentation: http://doctrine-orm.readthedocs.org/en/latest/reference/limitations-and-known-issues.html#join-columns-with-non-primary-keys

Es ist nicht möglich zu verwenden, um Spalten zu verbinden Hinweis auf Nicht-Primärschlüssel Lehre werden denken, das sind die Primärschlüssel sind und erstellen faul-Laden . Proxies mit den Daten, die zu unerwarteten Ergebnissen führen können Doctrine kann aus Gründen der Performance die Richtigkeit dieser Einstellungen zur Laufzeit nicht überprüfen, sondern nur durch den Befehl Schema überprüfen.

ähnliche Frage: Is it possible to reference a column other than 'id' for a JoinColumn?