1

我很新的Symfony和Doctrine,我面临一个问题,试图设置类表继承。我有一个名为“TeamActionTarget”的父实体,还有两个名为“玩家”和“竞争”的孩子。 我父实体的模型如下:类表继承,存储库 - > findByTypeId

// src/Van/TeamsBundle/Entity/TeamActionTarget.php 

namespace Van\TeamsBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* Van\TeamsBundle\Entity\TeamActionTarget 
* 
* @ORM\Entity 
* @ORM\Table(name="van_teams_actions_targets") 
* @ORM\InheritanceType("JOINED") 
* @ORM\DiscriminatorColumn(name="type_id", type="integer") 
* @ORM\DiscriminatorMap({"1" = "Competition", "2" = "Player"}) 
*/ 
abstract class TeamActionTarget 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * Get id 
    * 
    * @return integer 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 
} 

Doctrine2产生我父表中,有2场,“ID”和“TYPE_ID”,和2条儿童桌,用自己独特的领域。 我现在想要做的是从表单中发布的整数值中检索所有的BY BY子类。

所以在控制器,我编写了这一点:

$em->getRepository('VanTeamsBundle:TeamActionTarget')->findByTypeId($targetType); 

但Symfony2的返回我一个错误: 实体 “范\ TeamsBundle \实体\ TeamActionTarget” 无场 “TYPEID” 这是真的。实体模型不包含这个字段,只有父类。所以我试图在实体模型中添加这个字段,但是在尝试更新实体时出现错误,说这个字段和鉴别器之间存在冲突。

我的问题很简单,我如何检索我的孩子BY TYPE,从表单发布?

+0

你必须设置一个'@ OnetoMany'关系从父母到子女 – Nisam

+0

我应该在哪里添加这个?在父实体还是在子实体中? – VaN

+0

在父实体中,您可以添加$ TypeId和相应的getters和seters请参考octrine手册http://docs.doctrine-project.org/zh/2.0.x/reference/association-mapping.html – Nisam

回答

2

当使用单表继承,你必须使用子类直接的库:

$em->getRepository('VanTeamsBundle:Player')->findAll(); 

如果您想获取相关表单上的不同子实体,你必须使用实体别名(例如VanTeamsBundle:Player)作为表单字段值并将其传递给getRepository()方法。另一种方法是使用data transformers在表单字段值和实体别名之间执行自定义映射。