2011-09-26 13 views
7

Próbuję wstawić oferty Class Table Inheritance Doctrine 2 w moim projekcie Symfony 2. Powiedzmy, że masz Pizza klasę, Burito klasa i klasa MacAndCheese które dziedziczą z Żywności klasie.Doctrine 2 - Problemy z poziomem dostępu podczas korzystania z dziedziczenia z tabeli klas

Food klasa ma następujące ustawienia:

<?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; 

I dziedziczone klasy mają te ustawienia (Pizza przykładowo):

<?php 

namespace Kitchen; 

use Doctrine\ORM\Mapping as ORM; 

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

Uruchamiając doktryny: schemat: aktualizacja --force z aplikacji/konsoli Symfony 2 Pojawia się błąd dotyczący t on dostęp poziom $ id w dzieciach Żywności (Pizza na przykład), stwierdzając, musi być chroniony lub słabsze. I nie zadeklarowały $ id gdziekolwiek w Pizza, ponieważ uznałem, że będzie dziedziczona z Żywności.

Tak więc próbowałem zadeklarować $ id, ale to daje mi błąd, ponieważ nie mogę redeclare $ id. I rysunek muszę jakieś odniesienie do $ id od Żywności w Pizza, ale dokumentacja Doctrine 2 tak naprawdę nie dał mi jasnej odpowiedzi na to, co to będzie wyglądać.

Mam nadzieję, że rozumiesz, co mam na myśli i mogę mi pomóc.

Odpowiedz

4

Najwyraźniej powinienem zbadać kod wygenerowany przez doktryny: generate: podmioty nieco więcej. Kiedy zacząłem IDE to rano i znowu zobaczyć kod, zauważyłem, że miał „skopiowane” wszystkich odziedziczonych pól (jak $ id w Żywności, w powyższym przykładzie) dla dzieci (Pizza, w powyższym przykładzie).

Z jakiegoś powodu zdecydowano się na te pola prywatne. Ręcznie zmieniłem poziom dostępu na chroniony we wszystkich klasach i próbowałem uruchomić doktrynę: schemat: aktualizacja --force ponownie: zadziałało!

Tak więc, jak w wielu przypadkach, rozwiązanie było dobrym spokojem! ;)

Jeśli ktoś wymyśli lepsze rozwiązanie i/lub wyjaśnienie tego problemu, proszę go opublikować. Byłbym bardziej niż szczęśliwy, gdyby zmieniłem zaakceptowaną odpowiedź.

+0

Czy mówisz, że to IDE zmieniało poziom dostępu do twoich pól? To trochę przerażające. Jakiego IDE używasz, więc mogę mieć oko na to, co się dzieje? – cantera

+0

@ cantera25 To nie było IDE, to była doktryna Symfony 2: generate: entities, która to zrobiła. –

+0

Dzięki. Zaoszczędził mnóstwo mojego czasu. –

0

Coś pamiętać:

Każda jednostka musi posiadać identyfikator/klucz podstawowy. Nie można generować jednostek w hierarchii dziedziczenia (beta) Jako obejście podczas generowania metod dla nowych podmiotów, odjąłem się od projektu dziedziczonych encji, a po wygenerowaniu usunąłem je.

source

+0

Dzięki, ale o ile mogę powiedzieć, że tak naprawdę chodzi tylko o generowanie encji i chcę tylko wygenerować moją bazę danych (być może te metody są powiązane wewnętrznie w Doctrine 2, chociaż nie wiem). –

0

Może należy zdefiniować @ORM \ DiscriminatorMap w taki sposób:

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

Jeśli porównać kod z przykładu z serwisu Doctrine, widać, że jednostka dominująca dodanego do DiscriminatorMap .

Powiązane problemy