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

时间:2011-09-26 17:09:25

标签: php symfony doctrine doctrine-orm

我正在尝试在我的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文档并没有真正让我明白回答这会是什么样的。

希望你理解我的意思并且可以帮助我。

3 个答案:

答案 0 :(得分:4)

显然我应该调查一下 doctrine:generate:entities 生成的代码。当我今天早上启动IDE并再次看到代码时,我发现它已经“复制”了所有继承的字段(例如 Food <中的 $ id / strong>,在上面的例子中)给孩子们(披萨,在上面的例子中)。

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

所以,在很多情况下,解决方案是晚安! ;)

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

答案 1 :(得分:0)

要记住的事情:

  

每个实体必须具有标识符/主键。你无法生成   目前继承层次结构中的实体(beta)作为解决方法   在为新实体生成方法时,我离开了项目   继承实体,生成后我将它们移回。

source

答案 2 :(得分:0)

可能应该以这种方式定义@ORM \ DiscriminatorMap:

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

如果您将代码与Doctrine网站上的示例进行比较,您会看到他们将父实体添加到DiscriminatorMap。