【发布时间】:2016-12-27 08:42:53
【问题描述】:
我在尝试使用 Doctrine Single Table Inheritance 时遇到了一个严重的问题。
我有一个Division 实体,它代表地理区域(城市、县、国家、地区或任何特定国家/地区的行政区域)。对于我的应用程序需求,我需要使用City 实体来专门识别城市。城市是世界上广泛共享的行政区域,我认为这是有道理的。
这是我基本上想要的:
class Division {
/** @var boolean */
protected $city;
}
class City extends Division {
/** @var boolean */
protected $city = true;
}
都是共享同一张表的 Doctrine 实体。
使用存储库,我希望能够获得这种行为:
// return counties, regions, AND cities but all mapped to Division class
$divisionsRepositories->findAll();
// return only cities, mapped to City class
$citiesRepositories->findAll();
// if id #12 is a division with $city = false, returns null
$citiesRepositories->find(12);
// persist to divisions table a row with city = 1
$citiesRepositories->persist(new City("Paris"));
我在鉴别器上玩了很多次,但找不到获得此结果的方法,因为鉴别器迫使我为 Division 实体做出独特的选择(因此查询总是得到 city IN ('0'))。我什至尝试创建一个“loadClassMetadata”事件侦听器来覆盖元数据,但它破坏了很多东西。
如果问“为什么”这个问题:类型提示、更准确的相关实体关系、特定存储库(以及更好的 DI)...很多原因!
关于如何用 Doctrine 重现这个的任何想法?看起来很简单,让我抓狂!
[编辑] 这是我在 cmets 中尝试过的 discriminatorMap (其中之一):
/**
* @ORM\Table(name="divisions")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\Entity()
* @ORM\DiscriminatorColumn(name="city", type="integer")
* @ORM\DiscriminatorMap({
* 0 = "Division",
* 1 = "Division",
* 1 = "City"
* })
*/
abstract class AbstractDivision
【问题讨论】:
-
你的鉴别器地图怎么样?你能告诉我们吗?
-
@ViníciusFagundes:使用示例编辑帖子
-
我正在写一个答案,但是.. 如果
City本身始终是Division,为什么您需要将所有内容都返回为Division实例? -
是的,我真的不想在
Division结果中间有一个City对象,因为 City 本身就是一个部门
标签: php symfony doctrine-orm doctrine