Symfony加入相同的表格,以获得值作为别名从表

问题描述:

id name referred_by_id 
1 test1 2 
2 test2 1 
3 test3 1 

我想添加一个新的列查询出put referencedByName基于referencedByID。这等于id。Symfony加入相同的表格,以获得值作为别名从表

SELECT t1.*, t2.name AS refname 
FROM tbl_students t1 
JOIN tbl_students t2 
    ON t1.referred_by_id = t2.id 
ORDER BY t1.id 

我想这样做JOIN(同桌)在Symsofny我查询

$repo = $this->getDoctrine()->getRepository('C2EducateToolsBundle:Students'); 
      $leadsData['leads'] = $repo->createQueryBuilder('t') 
          ->select('t.id', 't.name','t.referredByID','t.referredBy') 
          ->where('t.id = :stuID') 
          ->setParameter('stuID', $leadId) 
          ->getQuery()->getResult(); 

我一定要改变实体的任何associaltion?

我改变了我的实体

/** 
      * @var integer $referredByID 
      * 
      * @ORM\Column(name="referred_by_id", type="integer", nullable=true) 
      * @Type("integer") 
      */ 
      protected $referredByID; 

/** 
    * @var referredByID 
    * 
    * @ORM\ManyToOne(targetEntity="Students", cascade={"persist", "remove", "merge"}) 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="referred_by_id", referencedColumnName="id") 
    * }) 
    * @Type("C2Educate\ToolsBundle\Entity\Students") 
    */ 
    protected $referredByID; 
+0

是的,你有你的学生实体自我参照实体定义referredBy财产(多对一和一对多)。所以,当你得到Student对象也会有学生类型 –

+0

的referredBy对象我这样做,我在我的问题更新相同。我如何在我的教条查询中获得该字段? – Developer

如果您在主实体中有关联映射,那么您无需在查询构建器中提及,因为当您获取该教义对象时,它将具有其关联对象的数据,如查询更新选择方法到->select('t')

如果查询返回对提供学生证的学生对象,然后学生对象,你可以调用它的关联对象的getter方法作为

$student->getReferredByID()->getName() 

上面的语句将返回相关的学生谁被标记为名称为此对象引用。

此外,如果您是通过主键搜索,你可以只使用在存储库,而不是使用查询生成器find()方法。

虽然你可以给查询生成器的别名也

+0

谢谢,我的协会映射是否正确。 ? – Developer

+0

是的,它对我来说看起来很好,但名称约定不是按照标准进行的,就像定义任何关联时一样,您定义的关系名称像'$ referencedBy'而不是'$ referencedByID' –

您在实体定义的关联后,您的查询应该是这样的:

$repo->createQueryBuilder('t') 
     ->select('t.id', 't.name','t.referredByID', 'p.name as parent_name') 
     ->join('t.referredByID', 'p') // joining self entity with parent id ref. 
     ->where('t.id = :stuID') 
     ->setParameter('stuID', $leadId) 
     ->getQuery()->getResult(); 

这应该让你parent_name密钥下的相关父母名称。

但是,由于查询似乎是一个单一的项目。为什么不简单地加载实体并使用getter ref来加载父实体和名称?

+0

我收到此错误。 '[语义错误]第0行,第496行'nearByID'附近,错误:无效PathExpression。必须是StateFieldPathExpression.' – Developer

+0

只需检查属性名称即可。休息应该是一样的。 – Jeet