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()
    }
}