我正在尝试在我的Symfony 2项目中实现Class Table Inheritance Doctrine 2优惠。 假设有一个 Pizza 类, Burito 类和一个 MacAndCheese 类,它们都来自 Food 上课。
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 {
从Symfony 2 app / console运行 doctrine:schema:update --force 时,我收到有关 $ id 的访问级别的错误< strong> 食物 (例如比萨饼),声明它必须受到保护或更弱。我没有在披萨中的任何地方声明 $ id ,因为我估计它会从 Food 继承。
所以我尝试声明 $ id ,但这给了我一个错误,因为我无法重新声明$ id。 我想我需要在披萨中对 食物 中的$ id进行某种引用,但是Doctrine 2文档并没有真正让我明白回答这会是什么样的。
希望你理解我的意思并且可以帮助我。
答案 0 :(得分:4)
显然我应该调查一下 doctrine:generate:entities 生成的代码。当我今天早上启动IDE并再次看到代码时,我发现它已经“复制”了所有继承的字段(例如 Food <中的 $ id / strong>,在上面的例子中)给孩子们(披萨,在上面的例子中)。
出于某种原因,它决定将这些字段设为私有。我手动将访问级别更改为所有类中的 protected ,我尝试再次运行 doctrine:schema:update --force :它工作正常!
所以,在很多情况下,解决方案是晚安! ;)
如果有人为此问题提出了更好的解决方案和/或解释,请发布。我非常乐意改变已接受的答案。
答案 1 :(得分:0)
答案 2 :(得分:0)
可能应该以这种方式定义@ORM \ DiscriminatorMap:
/**
*
..
* @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"})
*/
如果您将代码与Doctrine网站上的示例进行比较,您会看到他们将父实体添加到DiscriminatorMap。