Доктрина Symfony соединяет связанные сущности со столбцами дискриминатора
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 ответ
Я достиг динамических отношений, используя Single Table Inheritance. Это позволит вам писать DQL против отношения или против различающего класса.
Вы НЕ МОЖЕТЕ "запросить" дискриминатор, используя DQL. Вы должны ВМЕСТО имя субъекта, увидеть возможные дубликаты согласно комментарию @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();
}
}
По сути, расширяющиеся таблицы могут переопределять аннотации (если таковые имеются) родительского элемента.
Это работа - мечта, и у нас есть многократное использование этого на нашем монолите:)
Непроверенный код, но он должен дать вам представление о том, как я его достиг. Если вы будете бороться отсюда, я пойду и позабочусь, чтобы все заработало.