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

我试图在我的Symfony 2项目中实现Class Table Inheritance Doctrine 2提供的功能。 假设有一个Pizza类, Burito类和一个MacAndCheese类,它们都从Food类继承而来。

食物类具有以下设置:

<?php

namespace Kitchen;

use DoctrineORMMapping as ORM;

/** 
 * @ORMEntity
 * @ORMTable(name="food")
 * @ORMInheritanceType("JOINED")
 * @ORMDiscriminatorColumn(name="dish", type="string")
 * @ORMDiscriminatorMap({"pizza" = "Pizza", "burito" = "Burito", "mac" => "MacAndCheese"})
 */
class Food {

/**
 * @ORMId
 * @ORMColumn(type="integer")
 * @ORMGeneratedValue(strategy="AUTO")
 */
protected $id;

而继承的类有这些设置(比如比萨饼 ):

<?php

namespace Kitchen;

use DoctrineORMMapping as ORM;

/**
 * @ORMEntity
 * @ORMTable(name="food_pizza")
 */
class Pizza extends Food {

从Symfony 2应用程序/控制台运行doctrine:schema:update --force时,我得到一个有关食品 (例如比萨饼 )儿童的$ id访问级别的错误,指出它必须受到保护或较弱。 我没有在披萨中的任何地方声明$ id,因为我估计它会从Food中继承。

所以我试图声明$ id,但是这给了我一个错误,因为我不能重新声明$ id。 我想我需要一些参考来自Food in Pizza的 $ id,但是Doctrine 2文档并没有真正给我一个清楚的答案。

希望你明白我的意思并能帮助我。


显然我应该调查由教义产生的代码:生成:实体多一点。 当我今天早上开始我的IDE并再次看到代码时,我注意到它已将所有继承的字段(如上面的示例中的Food ID中的$ id)复制到孩子们(在上面的示例中为Pizza )。

由于某种原因,它决定将这些字段设置为私有。 我手动将访问级别更改为在所有类中受保护,并尝试运行doctrine:schema:update --force again:它工作正常!

所以,就像在很多情况下一样,解决方案是一个很好的休息时间! ;)

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


要记住的事情:

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

资源


可能你应该用这样的方式定义@ORM DiscriminatorMap:

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

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

链接地址: http://www.djcxy.com/p/55045.html

上一篇: Access level problems when using Class Table Inheritance

下一篇: compute rounded in cobol