你好,
我有一个类汽车和类CarTypes,在多对多关系中,车辆包含车类型的阵列集合。我想搜索满足多个选定CarTypes(从数组中的表单传递)中任意一个的汽车。
到目前为止,我只能想到三个嵌套循环,第一个在Cars上,第二个在ids数组上的内循环(从形式)和CarTypes中ArrayCollection上的第三个内循环,以检查第二个循环的值是否存在于第三个循环中。
我已经检查了以下与关闭相关的链接。但是,文档中的这些链接或没有任何链接提供了足够的详细信息,说明如何将选定的id数组与ArrayCollection中的ids进行匹配。
原则2阵列采集滤波方法
原则2,实体内部查询
我有自定义存储库,但我觉得最好在Cars类中使用ArrayCollection的exists来实现它,可能如下所示:
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-我从一个更复杂的方法中提取了这个代码,所以不能保证它是无错误的!