从 ArrayCollection 中提取 ID 以与 ID 数组进行比较

Extract IDs from ArrayCollection to compare to array of IDs

美好的一天,

我有一个 class Cars 和 class CarTypes 的多对多关系, Cars 包含 ArrayCollectionCarTypes。我想搜索满足多个选定 CarTypes 中的任何一个的汽车(从数组中的表单传递)。

到现在我只能想到三个嵌套循环,第一个在 Cars 上,第二个内部循环在 ids 数组(来自表单)上,第三个内部循环在 [=29= CarTypesCarTypes 的 ]ArrayCollection 检查第 2 个循环的值是否存在于第 3 个

我已经检查了以下与关闭相关的链接。但是这些或文档中的 none 链接提供了足够的详细信息,说明如何将选定的 ids 数组与来自 ids 的数组进行匹配ArrayCollection.

Doctrine 2 ArrayCollection filter method

Doctrine 2, query inside entities

我有自定义存储库,但感觉最好在 Cars class 中使用 exists 实现它 ArrayCollection,可能类似于以下内容:

public function existsCarTypes($ctArray)
{
    $CarTypes = $this->CarTypes;
    return $CarTypes->exists( 
            function($CarTypes) use ($ctArray) 
            {
                if (in_array($ctArray , $CarTypes->getId() )) 
                {
                    return true;
                }
                return false;
            }
        );
}

但这不起作用,有没有更好的方法,请提供任何好的文档链接。

对于某些其他语言或体系结构,将 Car 搜索实现为 Car 上的静态方法可能是有意义的 class。但是,原则 ORM 的工作方式是在自定义存储库中实现实体搜索的正确位置 class。

可能有更好的方法来进行这样的搜索,但我过去就是这样做的(我假设您知道如何向实体添加自定义存储库,因为您提到他们在你的问题中):

class CarRepository extends EntityRepository
{ 
    public function findByCarTypes(array $carTypeIds)
    {
        if (!count($carTypeIds)) { return new ArrayCollection(); }

        $carTypesCondition = '';
        $parameters = array();

        for($i = 1; $i <= count($carTypeIds); $i++)
        {
            if (!empty($carTypesCondition)) { $carTypesCondition .= ' OR '; }
            $carTypesCondition .= 'carType.id = :carTypeId' . $i;
            $parameters['carTypeId' . $i] = $carTypeIds[$i-1];
        }

        $queryBuilder = $this->createQueryBuilder('car')
            ->innerJoin('car.carTypes', 'carType', 'WITH', $carTypesCondition);
            ->setParameters($parameters);

        $query = $queryBuilder->getQuery();
        $cars = $query->getResult();

        return $cars;
    }
}

注意 - 我从一个更复杂的方法中提取了这段代码,所以不能保证它没有错误!