从 ArrayCollection 中提取 ID 以与 ID 数组进行比较
Extract IDs from ArrayCollection to compare to array of IDs
美好的一天,
我有一个 class Cars 和 class CarTypes 的多对多关系, Cars 包含 ArrayCollection 的 CarTypes。我想搜索满足多个选定 CarTypes 中的任何一个的汽车(从数组中的表单传递)。
到现在我只能想到三个嵌套循环,第一个在 Cars 上,第二个内部循环在 ids 数组(来自表单)上,第三个内部循环在 [=29= CarTypes 的 CarTypes 的 ]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;
}
}
注意 - 我从一个更复杂的方法中提取了这段代码,所以不能保证它没有错误!
美好的一天,
我有一个 class Cars 和 class CarTypes 的多对多关系, Cars 包含 ArrayCollection 的 CarTypes。我想搜索满足多个选定 CarTypes 中的任何一个的汽车(从数组中的表单传递)。
到现在我只能想到三个嵌套循环,第一个在 Cars 上,第二个内部循环在 ids 数组(来自表单)上,第三个内部循环在 [=29= CarTypes 的 CarTypes 的 ]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;
}
}
注意 - 我从一个更复杂的方法中提取了这段代码,所以不能保证它没有错误!