id name referred_by_id
1 test1 2
2 test2 1
3 test3 1
我想添加一个新列,用于查询 put referredByName 基于 referredByID。 等于 id。
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
我想在 Symsofny 中为我的查询做这个 JOIN(同表)
$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();
我是否必须更改实体中的任何社会性。?
我更改了我的实体
/**
* @var integer $referredByID
*
* @ORMColumn(name="referred_by_id", type="integer", nullable=true)
* @Type("integer")
*/
protected $referredByID;
自
/**
* @var referredByID
*
* @ORMManyToOne(targetEntity="Students", cascade={"persist", "remove", "merge"})
* @ORMJoinColumns({
* @ORMJoinColumn(name="referred_by_id", referencedColumnName="id")
* })
* @Type("C2EducateToolsBundleEntityStudents")
*/
protected $referredByID;
如果您的主实体中有关联映射,则无需在查询生成器中提及,因为当您获取 doctrine 对象时,它将拥有其关联对象的数据,就像在您的查询更新中选择方法来->select('t')
一样。
如果您的查询根据提供的学生 ID 返回学生对象,则在学生对象上,您可以将其关联对象的 getter 方法调用为
$student->getReferredByID()->getName()
上述语句将返回标记为此对象引用的关联学生的姓名。
此外,如果您正在搜索主键,则可以在存储库上使用find()
方法,而不是使用查询构建器。
虽然您也可以在查询构建器中提供别名
在实体中定义关联后,您的查询应如下所示:
$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 加载父实体和名称?