从数组列表中按字段排序原则集合



我有一个包含几个对象的学说集合。每个对象都有一个名为control的字段。该字段包含一个数字。

我如何从集合中返回一组对象,匹配并按给定数组的control顺序排列(在这种情况下,[1616, 1617, 518])?

这个想法是,你从数据库中有很多记录(比如20多条),你把它们保存在Doctrine Collection中。在集合中,每条记录都采用实体的形式。每个实体都有一个名为control的字段。字段中包含一个数字。每个实体的控制字段包含一个不同的数字。因此,20多个条目中的每一个都有它。

Doctrine提供了几种从集合中排序和获取条目子集的方法。这包括不同的排序过滤器函数。但它们都没有提供一种方法来以自定义方式对得到的结果排序。在这种情况下,我需要将control=1616的记录放在列表的第一位,其次是1617,然后是518。这样做的原因是:每个实体都有另一个名为fact的字段。对于某些实体,fact字段为空。因此,在迭代时,我希望按照提供的顺序获得第一个可用的"fact"。顺序很重要。

我可以创建一个函数来查询这三个元素的集合(尽管它可以是不同数量的项目),迭代它们以将每个实体的键转换为其control字段的值,然后简单地使用本地PHP函数按所需的顺序排列实体。但当集合变大时,这将是非常低效和反直觉的。毕竟,如果我错过了这三个字段中的fact(一个文本字段),我需要按照任何顺序继续使用其他字段以获得它。因此,这三个应该首先出现在列表中,然后是其他的。

所以我想知道是否有人对这个问题有不同的看法,或者是否应该打开一个问题,要求这个功能(尽管我不知道有任何推动这样一个功能来保证它的实现)。

下面的代码将解决您的需求:

$controlArray = [1616, 1617, 518];
$collection = $this->createQueryBuilder('c')
->andWhere("c.control in (:control)")
->setParameter('control', $controlArray)
->orderBy('c.control', 'ASC')
->getQuery()->getResult();