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


Extract IDs from ArrayCollection to compare to array of IDs

你好,

我有一个类汽车和类CarTypes,在多对多关系中,车辆包含车类型阵列集合。我想搜索满足多个选定CarTypes(从数组中的表单传递)中任意一个的汽车。

到目前为止,我只能想到三个嵌套循环,第一个在Cars上,第二个在ids数组上的内循环(从形式)和CarTypesArrayCollection上的第三个内循环,以检查第二个循环的值是否存在于第三个循环中。

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

原则2阵列采集滤波方法

原则2,实体内部查询

我有自定义存储库,但我觉得最好在Cars类中使用ArrayCollectionexists来实现它,可能如下所示:

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类上的静态方法来实现可能是有意义的。然而,ORM原理在实现实体搜索的正确位置工作的方式是在自定义存储库类中。

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

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;
    }
}

NB-我从一个更复杂的方法中提取了这个代码,所以不能保证它是无错误的!