Php 原则2-使用类表继承时的访问级别问题

Php 原则2-使用类表继承时的访问级别问题,php,symfony,doctrine,doctrine-orm,Php,Symfony,Doctrine,Doctrine Orm,我正在尝试在我的Symfony 2项目中实现Doctrine 2提供的功能。 比如说,有一个比萨饼类、一个布里托类和一个麦当劳奶酪类,它们都是从食品类继承而来的 食品类具有以下设置: <?php namespace Kitchen; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="food") * @ORM\InheritanceType("JOINED") * @ORM\Discr

我正在尝试在我的Symfony 2项目中实现Doctrine 2提供的功能。 比如说,有一个比萨饼类、一个布里托类和一个麦当劳奶酪类,它们都是从食品类继承而来的

食品类具有以下设置:

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

需要记住的事情:

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


显然,我应该更深入地研究一下doctrine:generate:entities生成的代码。今天早上,当我启动IDE并再次查看代码时,我注意到它已将所有继承字段(如上例中食物中的$id)“复制”给了孩子们(上例中的比萨饼)

出于某种原因,它决定将这些领域私有化。我手动将所有类中的访问级别更改为protected,并尝试运行条令:schema:update--force:再次生效

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


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

也许您应该用以下方式定义@ORM\DiscriminatorMap:

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

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

谢谢,但据我所知,这实际上是关于生成实体的,我只想生成我的数据库(也许这些方法在Doctrine 2中内部相关,我不知道).你是说你的IDE改变了你字段的访问级别吗?那有点可怕。你使用了什么IDE,这样我就可以密切注意这种情况了?@cantera25这不是IDE,是Symfony 2条令:generate:entities命令完成的。谢谢。这节省了我很多时间。@ArnoMoonen我想没关系,因为食品部的孩子们只能使用父母的
受保护的
公共的
财产。这就是为什么您需要定义
受保护的
,而不是
私有的
/**
 *
 ..
 * @ORM\DiscriminatorMap({"food" = "Food", "pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"})
 */