Доктрина 2 - Проблемы уровня доступа при использовании наследования таблиц классов - PullRequest
7 голосов
/ 26 сентября 2011

Я пытаюсь реализовать предложения Наследование таблиц классов в моем проекте Symfony 2. Допустим, у нас есть класс Pizza , класс Burito и класс MacAndCheese , которые наследуются от Food класс.

Класс Еда имеет следующие настройки:

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

И унаследованные классы имеют следующие настройки (например, Pizza ):

<?php

namespace Kitchen;

use Doctrine\ORM\Mapping as ORM;

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

При запуске doctrine: schema: update --force из приложения / консоли Symfony 2 я получаю ошибку об уровне доступа $ id в дочерних элементах Еда (например, Пицца ), заявив, что она должна быть защищена или слабее. Я не объявлял $ id нигде в Пицце , так как я рассчитывал, что она будет унаследована от Еда .

Поэтому я попытался объявить $ id , но это выдает ошибку, потому что я не могу переопределить $ id. Я полагаю, мне нужна какая-то ссылка на $ id из Еда в Пицца , но документация Doctrine 2 не дала мне однозначного ответа на вопрос, что это будет выглядеть так.

Надеюсь, вы понимаете, о чем я, и можете мне помочь.

Ответы [ 3 ]

4 голосов
/ 27 сентября 2011

По-видимому, мне следовало исследовать код, сгенерированный doctrine: generate: entity чуть больше.Когда сегодня утром я запустил свою среду IDE и снова увидел код, я заметил, что он «скопировал» все унаследованные поля (например, $ id в Food (в примере выше) для детей ( Pizza , в примере выше).

Почему-то было решено сделать эти поля приватными .Я вручную изменил уровень доступа на защищенный во всех классах и попытался снова запустить doctrine: schema: update --force : все заработало!

ТакКак и во многих случаях, решением стал хороший ночной отдых!;)

Если кто-то придумает лучшее решение и / или объяснение этой проблемы, пожалуйста, опубликуйте его.Я был бы более чем рад изменить принятый ответ.

0 голосов
/ 23 декабря 2011

Возможно, вам следует определить @ORM \ DiscriminatorMap следующим образом:

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

Если вы сравните ваш код с примером с сайта Doctrine, вы увидите, что они добавили родительскую сущность в DiscriminatorMap.

0 голосов
/ 27 сентября 2011

Что следует иметь в виду:

Каждый объект должен иметь идентификатор / первичный ключ.Вы не можете создавать сущности в иерархии наследования в настоящее время (бета). В качестве обходного пути при создании методов для новых сущностей я отошел от унаследованных от проекта сущностей и после генерации переместил их обратно.

source

...