Php 加入一对多关系的Symfony原则
我想将两个表连接在一起,以便在一次搜索中检索所有实体。我有一对多的关系:绝地武士和成员。一个成员团体可以有许多绝地武士。我想制作一个表单,通过一个实体进行搜索,并将所有信息显示为一个整体 示例:按指定的颜色搜索绝地->检索姓名、年龄、性别、颜色和等级 Jedi.php:Php 加入一对多关系的Symfony原则,php,symfony,join,doctrine-orm,Php,Symfony,Join,Doctrine Orm,我想将两个表连接在一起,以便在一次搜索中检索所有实体。我有一对多的关系:绝地武士和成员。一个成员团体可以有许多绝地武士。我想制作一个表单,通过一个实体进行搜索,并将所有信息显示为一个整体 示例:按指定的颜色搜索绝地->检索姓名、年龄、性别、颜色和等级 Jedi.php: class Jedi { /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(st
class Jedi
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var integer
*
* @ORM\Column(name="age", type="integer")
*/
private $age;
/**
* @var string
*
* @ORM\Column(name="gender", type="string", length=255)
*/
private $gender;
/**
*
* @ORM\ManyToOne(targetEntity="Member", inversedBy="jedi")
* @ORM\JoinColumn(name="member", referencedColumnName="id")
*/
private $member;
Member.php:
class Member
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="rank", type="string", length=255)
*/
private $rank;
/**
* @var string
*
* @ORM\Column(name="color", type="string", length=255)
*/
private $color;
/**
* @var integer
* @ORM\OneToMany(targetEntity="Jedi", mappedBy="member")
*
*/
protected $jedi;
在my repository.php中:
class JediRepository extends EntityRepository
{
public function findJediByColor($color) {
$query = $this->getEntityManager()
->createQuery(
'SELECT color, rank
FROM YodaBundle:Member member
JOIN member.jedi
WHERE member.color = :color'
)->setParameter('color', $color);
try {
return $query->getSingleResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
}
}
现在我很确定我可能把queryjoin语句搞错了,我对如何使用它感到非常困惑。任何帮助都将不胜感激 您的代码有错误。您的查询检索了许多行,但得到的却是单行(
getSingleResult()
)。正如您在文档中所看到的那样()getSingleResult()
将在每次有许多行满足您的查询时抛出异常。
此外,如果需要实体的所有列,则不需要在查询中指定每个列。您可以只指定要检索的实体:
$query = $this->getEntityManager()
->createQuery(
'SELECT member, jedi
FROM YodaBundle:Member member
JOIN member.jedi
WHERE member.color = :color'
)->setParameter('color', $color);
try {
return $query->getResult();
} catch (\Doctrine\ORM\NoResultException $e) {
return null;
}
注意,在Select语句中,我使用了member和jedi。在这种情况下,条令将使用渴望连接(一个查询中的所有数据)。如果您只需要选择成员,并且其中一些成员检索到绝地,则可以在查询的选择部分忽略绝地。首先,您应该将函数findEdibyColor移动到成员存储库,因为主表是Member而不是jedi 其次,您应该像下面的示例一样使用queryBuilder(在MemberRepository内部)。这将返回一个成员对象和绝地武士的阵列od。请注意,我使用“member_u”作为主要别名。不知何故,“member”不起作用(我现在不知道为什么) 如果您真的想对该查询使用DQL,它应该如下所示:
$query = $this->getEntityManager()
->createQuery(
'SELECT member_.color, member_.rank, jedi.name
FROM YodaBundle:Member member_
JOIN member_.jedi jedi
WHERE member_.color = :color'
)->setParameter('color', $color);
您不必创建具体的请求来执行类似的操作。 这可以简单地做到:
/**
* @var integer
* @ORM\OneToMany(targetEntity="Jedi", mappedBy="member",fetch="EAGER")
*
*/
protected $jedi;
公共函数findEdibyColor($color){
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findByColour($colour);
或
或
或具有多个标准
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findBy(array('colour' => $colour, 'rank' => $rank));
我承认我对教义不太熟悉,但如果表格是
YodaBundle:Member
,绝地表格不是YodaBundle:Jedi
?@steven你是说这个问题?
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findByRank($rank);
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findByJedi($jedi);
$this->getDoctrine()
->getRepository('YourBundle:Member')
->findBy(array('colour' => $colour, 'rank' => $rank));