2012-04-08 8 views
7

Ich bin dabei, eine veraltete PHP-Anwendung in Symfony 2 zu konvertieren. Die Anwendungsdaten sind im Moment nicht sehr konsistent, daher möchte ich vermeiden, Fremdschlüsseleinschränkungen zu erstellen. Ich habe die folgende Anmerkung in meiner "Produkt" Entity-Klasse:Doktrin 2 Zuordnung ohne Fremdschlüsseleinschränkungen

class Product { 

    // some definitions 

    /** 
    * @ORM\ManyToOne(targetEntity="Manufacturer") 
    * @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id") 
    */ 
    private $Manufacturer; 
} 

Als ich app/console doctrine:schema:update tun, erhalte ich den SQL-Befehl

ALTER TABLE products ADD CONSTRAINT FK_F6FA18741C3BF575 
    FOREIGN KEY (manufacturer_id) REFERENCES manufacturer(id); 

Wie kann ich das vermeiden?

Antwort

6

Grundsätzlich können Sie nicht verhindern, dass die SQL-Befehle generiert werden. Zumindest nicht ohne in den Doctrine-Code einzutauchen.

Sie müssen die Einschränkungen jedoch nicht wirklich auf Ihre Datenbank anwenden. D2 wird ohne sie gut funktionieren.

+0

Ja, aber dann kann ich nicht den Befehl 'app/console Lehre verwenden: schema: update --force' mehr, weil das Update stoppt, wenn es versucht, auszuführen die FK-Beschränkungen. – chiborg

0

Sie sollten die ManyToMany- und die JoinColumn-Definitionen auslassen und die Manufacturer-Eigenschaft in Ihrem benutzerdefinierten Produktrepository mit einer öffentlichen getManufacturer-Methode behandeln, die das automatisch generierte Produktrepository erweitert.

0

Ich hatte ein Problem mit dem gleichen Befehl. Ich habe die Ausnahme:

SQLSTATE[HY000]: General error: 1005 Can't create table 'xxx.#sql-66c_3e' (errno: 150)

Für mich ist es die Spalte als eindeutig (in Ihrem Fall id) zu erklären half.

Jetzt app/console doctrine:schema:update läuft wieder gut.

12

Ich musste vor kurzem den gleichen Prozess durchlaufen und zum Glück gibt es eine einfache Lösung, fügen Sie einfach nullable=true10 zu der Anmerkung der Spalte hinzu.

Dies funktioniert so lange wie die vorhandenen Daten gültig sind, in meinem Fall musste ich 0 zu NULL ändern und Schlüssel, die nicht existierten, auf NULL ändern.

+0

Dies sollte die akzeptierte Antwort sein –

+5

Ich habe es meiner 'JoinColumn' Annotation hinzugefügt, aber die Fremdschlüsselbedingung wird noch erstellt. – flu

+1

selbe wie @flu - kein Glück, Fremdschlüssel wird trotzdem erstellt –

-1

Try onDelete = "CASCADE" wie

* @ORM\JoinColumn(name="manufacturer_id", referencedColumnName="id", onDelete="CASCADE") 
0

Sie haben zu setzen verlorenen Fremdschlüssel hinzuzufügen, auf null setzen Sie können dann Ihre contstraint. Nach Abfrage gibt Ihnen die IDs von Datensätzen zu ändern:

select p.id from product p 
left join manufacturer m on m.id=p.manufakturer_id 
where m.id is null 
Verwandte Themen