使用类表继承时的访问级别问题
我试图在我的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