2011-09-26 9 views
7

Sto provando a impiantare le offerte di Doctrine 2 Class Table Inheritance nel mio progetto Symfony 2. Diciamo un avere un Pizza classe, Burito classe e una MacAndCheese classe cui tutti ereditano da un alimentari classe.Doctrine 2 - Problemi di livello di accesso durante l'utilizzo dell'ereditarietà delle tabelle di classe

Il cibo classe ha le seguenti impostazioni:

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="dish", type="string") 
* @ORM\DiscriminatorMap({"pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 
class Food { 

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

E le classi ereditate hanno queste impostazioni (Pizza per esempio):

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity 
* @ORM\Table(name="food_pizza") 
*/ 
class Pizza extends Food { 

Quando si esegue dottrina: schema: update --force dall'app/console Symfony 2 Ottengo un errore su t si accede livello di $ id nei figli di alimentari (Pizza per esempio), affermando che deve essere protetto o più debole. Non ho dichiarato $ id in qualsiasi parte del Pizza, dal momento che accreditò sarebbe stato ereditato da alimentari.

Così ho provato a dichiarare $ id, ma questo mi dà un errore, perché non posso ridichiarare $ id. Immagino ho bisogno di qualche tipo di riferimento a $ id da alimentari in Pizza, ma la documentazione Doctrine 2 non mi ha dato una risposta chiara su ciò che questo sarebbe simile.

Spero che tu capisca cosa intendo e mi può aiutare.

risposta

4

A quanto pare, avrei studiato il codice generato da doctrine: generate: entità un po 'di più. Quando ho iniziato la mia IDE questa mattina e vedere di nuovo il codice, ho notato che era 'copiato' tutti i campi ereditati (come $ id in alimentari, nell'esempio di cui sopra) per i bambini (Pizza, nell'esempio sopra).

Per qualche motivo ha deciso di rendere questi campi privato. Ho modificato manualmente il livello di accesso a protetto in tutte le classi e ho provato a eseguire dottrina: schema: aggiornamento --force di nuovo: ha funzionato!

Quindi, come in molti casi, la soluzione è stata una buona notte di riposo! ;)

Se qualcuno si presenta con una soluzione migliore e/o una spiegazione per questo problema, si prega di postarlo. Sarei più che felice di cambiare la risposta accettata.

+0

Stai dicendo che il tuo IDE è stato quello che ha cambiato il livello di accesso nei tuoi campi? È un po 'spaventoso. Che IDE usi, quindi posso tenere d'occhio che ciò accada? – cantera

+0

@ cantera25 Non era l'IDE, era la dottrina di Symfony 2: generare: comando entità che lo ha fatto. –

+0

Grazie. Ha risparmiato un sacco di tempo. –

0

Qualcosa da tenere a mente:

Ogni Ente deve avere una chiave di identificazione/primaria. Non è possibile generare le entità in una gerarchia ereditaria al momento (beta) Come soluzione temporanea durante la generazione di metodi per nuove entità, ho spostato le entità ereditate dal progetto e dopo averli generati, le ho spostate di nuovo.

source

+0

Grazie, ma per quanto posso dire questo è tutto sulla generazione di entità e voglio solo generare il mio database (forse questi metodi sono correlati internamente in Doctrine 2 anche se, non lo so). –

0

può essere che si dovrebbe definire il @ORM \ DiscriminatorMap in modo tale:

/** 
* 
.. 
* @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"}) 
*/ 

Se si confronta il codice con l'esempio dal sito di Doctrine, si vedrà che hanno aggiunto controllante al DiscriminatorMap .