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在表單字段值和實體別名之間執行自定義映射。