如何在Symfony和Doctrine中的两个实体上进行连接?

问题描述:

我有一个选择查询,我试图给它添加一个连接。如何在Symfony和Doctrine中的两个实体上进行连接?

在下面的例子,我有我使用返回一些结果Question实体,我想补充与User实体加盟,如:

SELECT question FROM question AS q LEFT JOIN USER u ON q.user_id= u.id;

我想结果是一个Question实体内User实体,是这样的:

private Question (entity) 
private id 
private user_id 
private User (entity) 
    private id 
    private name 

这里是我的

namespace AppBundle\Repository; 

use AppBundle\Entity\User; 
use AppBundle\Entity\Question; 
use Doctrine\ORM\EntityRepository; 
use Doctrine\ORM\Tools\Pagination\Paginator; 

class QuestionRepository extends EntityRepository 
{ 

    /** 
    * @param int $currentPage 
    * 
    * @return Paginator 
    */ 
    public function getQuestions($currentPage = 1) 
    { 
     $questions = $this->createQueryBuilder('question') 
      ->where('question.active is NULL') 
      ->getQuery(); 

     $paginator = $this->paginate($questions, $currentPage); 

     return $paginator; 
    } 
} 

我这样称呼它

$questionRepo = $this->container->get('doctrine')->getManager()->getRepository('AppBundle:Question'); 
$questions = $questionRepo->getQuestions(1); 

任何想法?

怎么样:

$questions = $this->createQueryBuilder('question') 
    ->leftJoin('question.user', 'question_user', 'WITH', 'question_user.user = :user_id') 
    ->where('question.active is NULL') 
    ->setParameter('user_id', $user_id) 
    ->getQuery(); 

$paginator = $this->paginate($questions, $currentPage); 

编辑:因为你的最新评论,我不得不提,这个建议是假设这样的(根据User的实体,您的Question实体的样子:

/** 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\User", inversedBy="question") 
* @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
private $user; 

如果没有,添加此,生成实体(php app/console doctrine:generate:entities AppBundle:Question)和更新DB(php app/console doctrine:schema:update --force)。

PS:在生成实体之前,您必须删除旧的getter/setter。

+0

我在'question_user'附近得到'[Semantical Error]:错误:类AppBundle \ Entity \ Question没有关联名为user' – Patrioticcow

+0

我想我需要告诉'Question'实体我有一个'User'实体 – Patrioticcow