2011-10-02 17 views
7

Come posso impostare il nome della chiave esterna (modifica: non il nome dell'attributo stesso) per la "regione" della relazione molti a uno con YAML?Denominare una relazione in Doctrine 2 ORM?

SWA\TestBundle\Entity\Province: 
    type: entity 
    table: province 
    uniqueConstraints: 
    UNIQUE_PROVINCE_CODE: 
     columns: code 
    id: 
    id: 
     type: integer 
     generator: { strategy: AUTO } 
    fields: 
    code: 
     type: integer 
    name: 
     type: string 
     length: 255 
    short_name: 
     type: string 
     length: 2 
    manyToOne: 
    region: 
     targetEntity: Region 
     inversedBy: provinces 

risposta

11

sguardo al getCreateConstraintSQL method in the AbstractPlatform class per vedere come il nome della chiave esterna è scelto (line 1088).

Viene prelevato direttamente dal nome del vincolo. Influenzare il nome del vincolo influenzerà il nome della chiave esterna.

Come soluzione alternativa è possibile eliminare il vincolo e ricrearlo con un nuovo nome in a doctrine migration.

+0

Quindi non esiste un modo "standard" per modificarlo, a parte la procedura di migrazione? Il nome è completamente casuale, suppongo, come FK_28392f89329. – gremo

+1

Bene, potresti sovraccaricare la classe della piattaforma, ma non penso che ne valga la pena solo per nominare il vincolo. –

+0

Accetto. Grazie, taglie + risposta per te! – gremo

3

A causa della risposta @JakubZalas, avevo dato un'occhiata al codice in Github e ho visto che cambiare il codice framework per fare ciò che vuoi è davvero facile.

Se si seleziona la cartella in cui si trova la classe AbstractPlatform, verrà visualizzata una classe ForeignKeyConstraint. In esso vedrai che eredita da AbstractAsset.

Ora la classe AbstractAsset ha un metodo _generateIdentifierName. Se si controlla questo metodo in github vedrete che ha una parte commentata che fa proprio quello che volete. Basta decommentare questa parte, commentare la parte attiva effettiva, modificare il parametro $ prefix in $ postfix e il gioco è fatto. Il nome del vincolo verrà generato utilizzando i nomi di tabella e colonna con un postfix corrispondente.

Il file AbstractAsset.php è il la cartella: Symfony/vendor/doctrine/dbal/lib/doctrine/DBAL/Schema

ho provato nel mio progetto formica ha funzionato bene.

Un'ultima informazione: almeno per il mio progetto la parte commentata che menziono sopra è solo in github, non nel file sul mio computer locale.