Symfony连接同一个表,从表中获取值作为别名


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 加载父实体和名称?

相关内容

  • 没有找到相关文章

最新更新