Php 学说与继承
鉴于以下实体:Php 学说与继承,php,inheritance,orm,doctrine,Php,Inheritance,Orm,Doctrine,鉴于以下实体: class Entity { protected $id; } class User extends Entity { /** @var Entity */ protected $target; } class Document extends Entity { protected $title; } class Report extends Entity { protected $level; } 我需要创建什么映射才能正确映射用户实体
class Entity {
protected $id;
}
class User extends Entity {
/** @var Entity */
protected $target;
}
class Document extends Entity {
protected $title;
}
class Report extends Entity {
protected $level;
}
我需要创建什么映射才能正确映射用户
实体。
这里的问题是,我希望能够让用户::$target
使用任何实体(因此使用实体
类型提示),然后在代码中能够做出相应的响应,这取决于它是文档
还是报告
这也意味着,在代码中,如果是文档
,我需要能够获取实体::$title
,或者实体::$level
如果是报告
我能用条令做到这一点吗?这应该很好。我没有添加像“@ORM\Entity”()这样的默认注释。 我希望这就是你要找的,否则让我知道
/**
* @ORM\InheritanceType("SINGLE_TABLE")
*/
class Entity {
protected $id;
}
class User extends Entity {
/**
* @ORM\ManyToOne(targetEntity="Entity")
* @var Entity
*/
protected $target;
}
看看:
由于性能问题,应该使用单继承而不是类表继承
否则,条令将对实体表的子表进行联接,因为条令不知道“实体”具有哪种类型。比如:
SELECT t1.id, t2.title, t3.level FROM entity t1 LEFT JOIN document t2 ON t2.id = t1.id LEFT JOIN report t3 ON t3.id = t1.id
更多的子表将导致更多的联接->慢
这就是检查目标是文档还是报表并确定必须访问哪个字段的方法
// loads all users
$users = $this->em->getRepository('User')->findAll();
foreach($users as $user){
$target = $user->getTarget()
if($target instanceof Document){
echo $target->getTitle();
}
else if($target instanceof Report){
echo $target->getLevel()
}
}