【发布时间】:2019-10-20 12:48:22
【问题描述】:
我发现几乎不可能达到我想要的结果,在这里和其他网站上使用不同的解决方案(子查询、原始查询等)进行了多次尝试之后,我必须提出这个问题。
我的目标是根据每个“项目”的“分数”提取/获取它们的排名。
将“score”视为 int 并具有 1、2、6、4、8、10、200 等值。
排名是这样的:
排名 - 得分
- 200
- 10
- 8
- 6
为了让我的问题尽可能简单明了,我将我的实际表/实体重命名如下:
MainEntity(main_table):
/**
* @ORM\Id
* @ORM\Column(name="id")
* @ORM\GeneratedValue
*/
protected $id;
// other fields, un-related to this question
/**
* @ORM\OneToOne(targetEntity="Application\Entity\SecondTable", mappedBy="second_table_data")
*/
protected $second_table;
/**
* @ORM\OneToOne(targetEntity="Application\Entity\ThirdTable", mappedBy="third_table_data")
*
*/
protected $third_table;
SecondEntity(second_table):
/**
* @ORM\Id
* @ORM\Column(name="id")
* @ORM\GeneratedValue
*/
protected $id;
// other fields, un-related to this question
/**
* @ORM\OneToOne(targetEntity="Application\Entity\SecondTable", inversedBy="second_table")
* @ORM\JoinColumn(name="project_id", referencedColumnName="id")
*/
private $second_table_data;
第三实体(third_table):
/**
* @ORM\Id
* @ORM\Column(name="id")
* @ORM\GeneratedValue
*/
protected $id;
// other fields, un-related to this question
/**
* @ORM\Column(name="score")
*/
protected $score;
/**
* @ORM\OneToOne(targetEntity="Application\Entity\ThirdTable", inversedBy="third_table")
* @ORM\JoinColumn(name="project_id", referencedColumnName="id")
*/
private $third_table_data;
以及选择按分数排序的“所有项目”的存储库功能:
public function findAllProjects()
{
$entityManager = $this->getEntityManager();
$queryBuilder = $entityManager->createQueryBuilder();
$queryBuilder->select('u')
->from(MainEntity::class, 'u')
->leftJoin('u.third_table', 't')
->orderBy('t.score', 'DESC');
return $queryBuilder->getQuery()->getResult();
}
这很好用(我相信),因为我根据他们的“project_id”从 main_table + second_table + third_table 获得所有“项目” ”。
但是问题是我找不到正确计算或获取每个项目的“排名”数字的方法。我还尝试使用“foreach”并将“index”用作“rank”,但这无法正常工作,因为我使用的是 ORMPaginator 所以每次单击“foreach”的“页面”时"index" 将从 0 重置。
我希望问题足够清楚,让您清楚地了解我的问题。
请告诉我如何实现这一点,如果我的整个方法是错误的,请指出。
我们非常感谢每一个建议/提示/解决方案。
【问题讨论】:
-
基本上,你想做一个左连接并按连接表中的一个字段排序,对吗?您想获取的 findAllProjects() 的返回值中缺少什么?
-
@SergioRinaudo 简单地按文件订购不会让我得到我需要/想要的东西,请看这个:stackoverflow.com/questions/3333665/rank-function-in-mysql 这就是我想要的。我可以通过“分数”对他们进行排序,这很好,但我想根据他们的分数获得他们的“排名”,1、2、3、4……这有意义吗?
-
其实,你想要的不是“他们的排名”,而是他们在有序列表中的位置。
-
这将是同一件事,所以是的。
-
您是否尝试将OrderBy Annotation 添加到您希望订购的属性上,例如“分数” ? (我的意思是,我在这里看到了复杂的尝试,但你也标记了 Doctrine,所以为了简单起见 -> 下一个 Criteria 过滤
MainEntity的集合)
标签: php zend-framework doctrine-orm doctrine zend-framework3