Doctrine 2 - 使用类表继承时的访问级别问题

Arn*_*nen 7 php doctrine symfony doctrine-orm

我正在尝试在我的Symfony 2项目中实现Class Table Inheritance Doctrine 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;
Run Code Online (Sandbox Code Playgroud)

并且继承的类具有这些设置(例如Pizza):

<?php

namespace Kitchen;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="food_pizza")
 */
class Pizza extends Food {
Run Code Online (Sandbox Code Playgroud)

当从Symfony 2应用程序/控制台运行doctrine:schema:update --force时,我收到一个关于Food(比萨饼)子女的$ id访问级别的错误,声明它必须受到保护或更弱.我没有在比萨饼的任何地方宣布$ id,因为我估计它将继承自Food.

所以我试图声明$ id,但这给了我一个错误,因为我无法重新声明$ id.我想我需要一些参考从$ ID 食品比萨,但原则2文档没有真正给我什么,这将看起来像一个明确的答案.

希望你明白我的意思,可以帮助我.

Arn*_*nen 4

显然我应该多研究一下由doctrine:generate:entities生成的代码。当我今天早上启动 IDE 并再次看到代码时,我注意到它已将所有继承字段(如上例中Food中的$id)“复制”到子级(上例中Pizza )。

由于某种原因,它决定将这些字段设为私有。我手动将所有类中的访问级别更改为protected,并尝试再次运行doctrine:schema:update --force:它有效!

因此,正如在许多情况下一样,解决方案就是好好休息一晚!;)

如果有人对此问题提出更好的解决方案和/或解释,请发布。我非常乐意更改已接受的答案。