Symfony 类表继承,存储库->;findByTypeId

Symfony 类表继承,存储库->;findByTypeId,symfony,doctrine-orm,data-retrieval,discriminator,class-table-inheritance,Symfony,Doctrine Orm,Data Retrieval,Discriminator,Class Table Inheritance,我对Symfony和Doctrine非常陌生,我在尝试设置类表继承时遇到了一个问题。我有一个称为“TeamActionTarget”的父实体,还有两个称为“Player”和“Competition”的子实体。 我的父实体的模型如下所示: // src/Van/TeamsBundle/Entity/TeamActionTarget.php namespace Van\TeamsBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Van

我对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为我生成了一个父表,其中有两个字段“id”和“type_id”,还有两个子表,它们有自己唯一的字段。 我现在要做的是从表单中发布的整数值中按类型检索所有子项

因此,在控制器中,我编写了以下代码:

$em->getRepository('VanTeamsBundle:TeamActionTarget')->findByTypeId($targetType);
但是Symfony2返回了一个错误: Entity“Van\TeamsBundle\Entity\TeamActionTarget”没有字段“typeId” 这是真的。实体模型不包含此字段,只有父类包含此字段。因此,我尝试在实体模型中添加此字段,但在尝试更新实体时出错,表示此字段与鉴别器之间存在冲突


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

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

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

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

您必须设置一个从父项到子项的
@OnetoMany
关系我应该在哪里添加这个?在父实体或子实体中?在父实体中,您可以添加$TypeId和相应的getter和seter,请参阅octrine手册