gpt4 book ai didi

mysql - Symfony Doctrine 将相关实体加入鉴别器列

转载 作者:行者123 更新时间:2023-11-30 21:51:37 34 4
gpt4 key购买 nike

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

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

最佳答案

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

实际上,扩展表可以覆盖父表的注释(如果有的话)。

它的工作是一个梦想,我们在我们的整体上有多种用途 :)

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

关于mysql - Symfony Doctrine 将相关实体加入鉴别器列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965101/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com