1

我对 Symfony 和 Doctrine 还很陌生,我在尝试设置类表继承时遇到了问题。我有一个名为“TeamActionTarget”的父实体,以及两个名为“Player”和“Competition”的子实体。我的父实体的模型如下:

// 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 个子表,它们具有自己的独特字段。我现在要做的是从表单发布的整数值中按类型检索所有子项。

所以在控制器中,我编写了这个:

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

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

我的问题很简单,如何按类型检索我的孩子,从表单发布?

4

1 回答 1

3

使用单表继承时,必须直接使用子类的repository:

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

如果您想检索依赖于表单的不同子实体,您必须使用实体别名(例如 VanTeamsBundle:Player)作为表单字段值并将其传递给 getRepository() 方法。另一种方法是使用数据转换器在表单字段值和实体别名之间执行自定义映射。

于 2014-03-19T19:52:07.323 回答