Symfony学说将相关实体加入到鉴别列

时间:2017-10-26 23:02:12

标签: mysql symfony join doctrine discriminator

RoundMatch.php

/**
 * @ORM\Entity(repositoryClass="MyApp\MyBundle\Repository\RoundMatchRepository")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="type", type="string")
 * @ORM\DiscriminatorMap({"team_round_match" = "TeamRoundMatch", "player_round_match" = "PlayerRoundMatch"})
 * @ORM\Table("my_round_match")
 */
abstract class RoundMatch
{

    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="match_date", type="datetime")
     */
    private $matchDate;

如何将相关实体加入受歧视的实体? 我无法直接访问有区别的表列来创建连接。

我无法访问有区别的表列来创建连接。 如何将儿童实体加入歧视实体?

我创建了这样的连接:

RoundMatchRepository.php

    public function getMatchesWithNoResultsSubmitted()
    {
            $qb = $this->createQueryBuilder("rm");
            $qb->leftJoin("rm.round", "rnd" )
            ->leftJoin("rnd.group", "sg")
            ->leftJoin("sg.server", "ss")
            ->leftJoin("ss.stage", "ts")
            ->leftJoin("ts.tournament", "t")
            ->leftJoin("MyAppMyBundle:PlayerRoundMatch", "prm", "WITH", "rm.id = prm.id")
            ->leftJoin("prm.player1", "p1")
            ->leftJoin("prm.player2", "p2")
            ->leftJoin('p1.gameProfiles',"gp1")
            ->leftJoin('p2.gameProfiles',"gp2")
            ->leftJoin('p1.gameProfiles', 'gp1', "WITH", $qb->expr()->andX(
                    $qb->expr()->eq('t.game', 'gp1.game'),
                    $qb->expr()->eq('prm.player1', 'gp1.player')
                ))
            ->leftJoin('p1.gameProfiles', 'gp2', "WITH", $qb->expr()->andX(
                    $qb->expr()->eq('t.game', 'gp2.game'),
                    $qb->expr()->eq('prm.player2', 'gp2.player')
                ));
                return $qb->getQuery()->getResult();
}

我想在树枝中使用结果对象,我不能在返回的对象中获取连接的实体,因为它们不是通过对象关系连接的。 我没有创建对象关系,因为它们是通过鉴别器一对一连接的。

1 个答案:

答案 0 :(得分:0)

我使用单表继承实现了动态关系。这将允许您针对关系或歧视类编写DQL。

您不能使用DQL“查询”鉴别器。您必须实体实体名称,请参阅possible duplicate根据@ LBA的评论

在此结果模式中,group_id将表示取决于鉴别器的不同关系。

显然,这会对数据库产生性能影响。

/**
 * @ORM\Entity
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="type", type="string", length=255)
 * @ORM\DiscriminatorMap(
 *   {"parents" = "Parents", "children" = "Child"}
 * )
 * @ORM\Table("people")
 */
class Person
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var mixed
     */
    private $group;
}

/*
 * @ORM\Table("parents")
 */
class Parent extends Person
{
    /**
     * Many parents have one group.
     *
     * @ManyToOne(targetEntity="ParentGroups", inversedBy="parents")
     * @JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $group;
}

/*
 * @ORM\Table("children")
 */
class Child extends Person
{
    /**
     * Many children have one group.
     *
     * @ManyToOne(targetEntity="ChildGroups", inversedBy="children")
     * @JoinColumn(name="group_id", referencedColumnName="id")
     */
    private $group;
}

/*
 * @ORM\Table("parent_groups")
 */
class ParentGroups
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * One group has many parents.
     *
     * @OneToMany(targetEntity="Parent", mappedBy="group")
     */
    private $parents;

    public function __construct() {
        $this->parents = new ArrayCollection();
    }
}

/*
 * @ORM\Table("child_groups")
 */
class ChildGroups
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * One group has many parents.
     *
     * @OneToMany(targetEntity="Child", mappedBy="group")
     */
    private $children;

    public function __construct() {
        $this->children = new ArrayCollection();
    }
}

有效地,扩展表可以覆盖父级的注释(如果有的话)。

这是一个梦想,我们在我们的巨石上有多种用途:)

未经测试的代码,但它应该让您了解我是如何实现它的。如果你从这里挣扎,我会去确保它运行。