获取 symfony 学说 findAll 以返回具有特定类型键的数组

Kik*_*nev 0 doctrine symfony

我正在寻找一种优雅的方式来重组由 Symfony findAll 返回的具有特定键的数组。例如,如果我有一个带有字段 id、name、color 等的实体 Animal。我想创建一个存储库方法,该方法返回一个包含所有动物的数组,并且每个动物的键都是“名称”字段,以便我可以进行查找在这个数组中。我现在的做法是迭代数组并创建一个新数组,但我想知道是否有现成的东西可以使用?

rev*_*nce 5

不,有一个东西内置的学说,叫做index by,我也很长时间不知道了。检查代码示例:)。

通过使用函数 getAllLocationsAssoc,它将返回由 location.id 索引的关联数组。所以数组的键将是db中对象的id。您可以像 createQueryBuilder 函数中的第二个参数一样使用它。

class LocationRepository extends EntityRepository
{
    /**
     * @return array
     */
    public function getAllLocationsAssoc(): array
    {
        return $this->createQueryBuilder('location', 'location.id') 
            ->getQuery()
            ->getArrayResult();
    }

}
Run Code Online (Sandbox Code Playgroud)

另一种选择是在 ->from qb 函数中指定为第三个参数。

<?php
namespace AppBundle\Repository;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;
/**
 * Class CityRepository
 * @package AppBundle\Repository
 */
class CityRepository extends EntityRepository
{
    /**
     * @return array
     */
    public function getAllCitiesAssoc(): array
    {
        return $this->_em->createQueryBuilder()
            ->select('c')
            ->from('AppBundle:City', 'c', 'c.name') // Third parameter is index-by
            ->getQuery()
            ->getResult();
    }
}
Run Code Online (Sandbox Code Playgroud)