Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从2个连接中检索数据,并使用Symfony 2检索每行的级别?_Php_Mysql_Database_Symfony - Fatal编程技术网

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查询来检索这些对象。我会更新我的答案,对正在发生的事情给出更多的评论。好的,很好,我明白了。非常感谢。