Php 从2个连接中检索数据,并使用Symfony 2检索每行的级别?
我有一个包含两个连接的表:广告、技能和每行的级别: 我可以通过以下方式获取数据:Php 从2个连接中检索数据,并使用Symfony 2检索每行的级别?,php,mysql,database,symfony,Php,Mysql,Database,Symfony,我有一个包含两个连接的表:广告、技能和每行的级别: 我可以通过以下方式获取数据: $listAdvertSkills = $em ->getRepository('OCPlatformBundle:AdvertSkill') ->findBy(array('advert' => $advert)) ; “join”方法会怎么样?像这样的 public function getSkillsForThisAdvert($id){ $qb
$listAdvertSkills = $em
->getRepository('OCPlatformBundle:AdvertSkill')
->findBy(array('advert' => $advert))
;
“join”方法会怎么样?像这样的
public function getSkillsForThisAdvert($id){
$qb = $this
->createQueryBuilder('a')
->join('a.advert', 'adv')
->where('adv.id', $id) //addSelect here?
->join('a.skill', 'sk');
->addSelect('sk');
return $qb->getQuery()->getResult();
}
另外,如果每个广告中都有一个“category”数组,那么如果我想得到:所有类别,
一个类别的所有广告,
一个广告所需的所有技能和水平 你有什么要求 在另一个页面中,相同但来自技能:
所有技能,
所有具备这些技能的广告,
一个广告中的所有类别 它只是为了理解正确的方法,它不适合任何工作
谢谢您是正确的-第一种方法可以工作,但是如果您想从任何关联实体检索数据,将运行其他查询。如果您列出了大量行,那么可能会产生几十个额外的查询,因此使用联接并预先选择其他实体是一种良好的做法 进一步解释-如果您在查询生成器中加入广告表和技能表,而不执行其他操作,则SQL查询将加入这些表,但不会从中选择任何信息。因此,如果您稍后尝试访问它们,则必须调用更多SQL查询来检索该信息。这就是为什么
addSelect
调用很重要的原因。这些命令(和SQL)检索相关实体的所有信息。例如,如果一个广告有5个额外的技能,那么您的SQL将返回5行,但条令将把它合并到5个技能实体的数组(或)中,这些技能实体可以从返回的单个广告对象访问
您的QueryBuilder可能如下所示:
public function getSkillsForThisAdvert($id)
{
$qb = $this
->createQueryBuilder('a')
->addSelect('adv')
->addSelect('sk')
->join('a.advert', 'adv')
->join('a.skill', 'sk');
->where('a.id = :identifier')
->setParameter(':identifier', $id);
return $qb->getQuery()->getResult();
}
您还可以将Advert
对象作为$Advert
传递给函数,并将查询生成器调用更改为具有->where('a=:Advert')->setParameter('Advert',$Advert')代码>
我还建议将函数名更改为getSkills
,因为您已经在传递所需的广告对象
如果您不喜欢使用QueryBuilder,您可以简单地使用看起来更像SQL的方法(而不是先使用QueryBuilder进行构建,然后使用getQuery
检索查询)。只要你们的实体与它们相应的相关实体被正确地定义,条令将为你们完成大部分繁重的工作。如果您想选择一个广告及其所有相关技能,Doctrine已经为您完成了检索一个对象以及数组或ArrayCollection中相应的技能对象的工作,而不是一个原始SQL语句,该语句将返回多个重复行并要求您自己处理
除了多个addSelect
语句之外,您还可以执行以下操作:
->select(array('a', 'adv', 'sk'))
另外,如果您将有几个WHERE条件,然后将您的WHERE
更改为addWhere
——事实上,最好总是使用addWhere
。好的,谢谢,关于其他查询,您说顺序很重要:addSelect然后join?否则,加入然后添加选择创建更多查询?不,当使用QueryBuilder时,调用addSelect
和join
等方法的顺序根本不重要。我的意思是,如果您没有显式地选择关联的对象(使用addSelect
),那么如果您稍后尝试访问它们,则必须有额外的SQL查询来检索这些对象。我会更新我的答案,对正在发生的事情给出更多的评论。好的,很好,我明白了。非常感谢。