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();
}
我想在树枝中使用结果对象,我不能在返回的对象中获取连接的实体,因为它们不是通过对象关系连接的。 我没有创建对象关系,因为它们是通过鉴别器一对一连接的。
答案 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();
}
}
有效地,扩展表可以覆盖父级的注释(如果有的话)。
这是一个梦想,我们在我们的巨石上有多种用途:)
未经测试的代码,但它应该让您了解我是如何实现它的。如果你从这里挣扎,我会去确保它运行。