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;
如果您在主实体中有关联映射,那么您无需在查询构建器中提及,因为当您获取该教义对象时,它将具有其关联对象的数据,如查询更新选择方法到->select('t')
。
如果查询返回对提供学生证的学生对象,然后学生对象,你可以调用它的关联对象的getter方法作为
$student->getReferredByID()->getName()
上面的语句将返回相关的学生谁被标记为名称为此对象引用。
此外,如果您是通过主键搜索,你可以只使用在存储库,而不是使用查询生成器find()
方法。
虽然你可以给查询生成器的别名也
谢谢,我的协会映射是否正确。 ? – Developer
是的,它对我来说看起来很好,但名称约定不是按照标准进行的,就像定义任何关联时一样,您定义的关系名称像'$ 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来加载父实体和名称?
是的,你有你的学生实体自我参照实体定义referredBy财产(多对一和一对多)。所以,当你得到Student对象也会有学生类型 –
的referredBy对象我这样做,我在我的问题更新相同。我如何在我的教条查询中获得该字段? – Developer