【问题标题】:Symfony doctrine join related entities to discriminator columnsSymfony 学说将相关实体连接到鉴别器列
【发布时间】:2017-10-26 23:02:12
【问题描述】:

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();
}

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

【问题讨论】:

标签: mysql symfony join doctrine discriminator


【解决方案1】:

我已经使用单表继承实现了动态关系。这将允许您针对关系或区分类编写 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();
    }
}

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

这是一个梦想,我们在我们的单体应用中有多种用途:)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多