0

给定以下实体:

class Entity {
    protected $id;
}
class User extends Entity {
    /** @var Entity */
    protected $target;
}
class Document extends Entity {
    protected $title;
}
class Report extends Entity {
    protected $level;
}

我需要创建什么映射,以便学说可以User正确映射实体。这里的问题是,我希望能够User::$target使用任何实体(因此是Entity类型提示),并且稍后在代码中能够做出相应的响应,具体取决于它是 aDocument还是 a Report

这也意味着,在代码中,我需要能够获取它Entity::$title是 aDocument还是.Entity::$levelReport

我可以通过教义实现这一点吗?

4

1 回答 1

1

这应该可以正常工作。我没有添加像“@ORM\Entity”(http://docs.doctrine-project.org/en/latest/reference/annotations-reference.html这样的默认注释。我希望这是您正在寻找的,否则请告诉我。

/**
 * @ORM\InheritanceType("SINGLE_TABLE")
 */
class Entity {
    protected $id;
}

class User extends Entity {
    /** 
     * @ORM\ManyToOne(targetEntity="Entity")
     * @var Entity 
     */
    protected $target;
}

看看:http : //docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html 由于性能问题,您应该使用单继承而不是类表继承。

否则,Doctrine 将对实体表的子表进行连接,因为 Doctrine 不知道“实体”具有哪种类型。就像是:

 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()
    }
}
于 2013-08-01T13:04:47.333 回答