2012-04-08 20 views
7

Sono in procinto di convertire un'applicazione legacy PHP in Symfony 2. I dati dell'applicazione non sono molto coerenti al momento, quindi vorrei evitare di creare vincoli di chiave esterna. Ho la seguente annotazione nel mio "Prodotto" classe entità:Associazione Doctrine 2 senza vincoli di chiave esterna

class Product { 

    // some definitions 

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

Quando faccio app/console doctrine:schema:update, ottengo il comando SQL

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

Come posso evitare questo?

risposta

6

Fondamentalmente non è possibile impedire la generazione dei comandi sql. Almeno non senza immergersi nel codice Doctrine.

Tuttavia, non è necessario applicare effettivamente i vincoli al database. D2 funzionerà bene senza di loro.

+0

Sì, ma allora non posso usare il comando 'app/console dottrina: schema: update --force' più perché l'aggiornamento si interrompe quando si prova ad eseguire i vincoli FK. – chiborg

0

È necessario omettere le definizioni ManyToMany e JoinColumn e gestire la proprietà Manufacturer nel repository del prodotto personalizzato con un metodo pubblico getManufacturer che estende il repository del prodotto generato automaticamente.

0

Ho avuto un problema con lo stesso comando. Ho ottenuto l'eccezione:

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

Per me ha aiutato a dichiarare la colonna come unica (nel tuo caso id).

Ora app/console doctrine:schema:update ora funziona nuovamente.

12

Ho dovuto ripetere lo stesso processo di recente e fortunatamente esiste una soluzione semplice, basta aggiungere nullable=true all'annotazione della colonna.

Questo funzionerà fintanto che i dati esistenti sono validi, nel mio caso ho dovuto cambiare da 0 a NULL e cambiare chiavi che non esistevano più a NULL.

+0

Questa dovrebbe essere la risposta accettata –

+5

L'ho aggiunta alla mia annotazione 'JoinColumn' ma il vincolo di chiave esterna è ancora in fase di creazione. – flu

+1

uguale a @flu - no fortuna, la chiave esterna viene creata in ogni caso –

-1

tenta di aggiungere onDelete = "a cascata", come

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

È necessario impostare le chiavi esterne perdute a NULL, è possibile impostare il contstraint. Seguente query ti dà gli ID di set di dati di cambiare:

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