Symfony:使用QueryBuilder加入请求

时间:2016-01-06 10:13:03

标签: php symfony doctrine-orm

我有一个包含2个表的数据库模型:用户和实验。关系是n:n,所以我用2个外键创建了第三个表。

|实验| 1 ------- 0..n | ExperimentationUser | 0..n ------- 1 |用户|

由于Doctrine(带注释)生成了实体。我有UserEntity和ExperimentationEntity,但没有ExperimentationUserEntity。当我查看USerEntity时,我可以找到“相关实验ID”的集合。

我想获得指定用户的所有实验名称(而不是ID)。在常见的SQL中,我将使用WHERE子句(用于用户ID选择)加入Experimentation和ExperimentationUser。但是因为我正在开始一个Symfony(2.8)项目,所以我想使用QueryBuilder。

我不熟悉语法,我不知道如何实现这一点。我尝试过:

    $repository = $this->getDoctrine()->getRepository('AppBundle:Experimentation');
    $query = $repository->createQueryBuilder('e')
                    ->join('...')
                    ->setParameter('id',$id)
                    ->getQuery();

但我不知道在join条款中放什么。我甚至不确定是否需要它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

这就是我做这种事情的方式。我不使用查询构建器,但你明白了。

在实体

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
/**
 * Experimentation
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="AppBundle\Entity\ExperimentationRepository")
 */
class Experimentation
{
 //...
}

在存储库类

namespace AppBundle\Entity;

use Doctrine\ORM\EntityRepository;

class ExperimentationRepository extends EntityRepository
{
   public function getExperimentationByUser($id) {

    $em = $this->getEntityManager();

    $query = $em->createQuery('SELECT e '
        . 'FROM AppBundle:Experimentation e '
        . 'JOIN e.experimentationUsers eu '
        . 'JOIN eu.user u '
        . 'WHERE u.id = :id ')
        ->setParameter('id', $id);

    return $query->getResult();
  }
}

然后在控制器中

//..
$em = $this->getDoctrine()->getManager();

$entity = $em->getRepository('AppBundle:Experimentation')->getExperimentationByUser($user_id);
//..

通过这种方式,您可以获得实验列表,然后获取它的名称,或者也可以在仅$query = $em->createQuery('SELECT e.name '的查询中获取。如果您还需要与用户相关的数据,可以放$query = $em->createQuery('SELECT e, u ',可能还可以保存一些数据库请求。

我希望这对你有所帮助。