【问题标题】:Extract IDs from ArrayCollection to compare to array of IDs从 ArrayCollection 中提取 ID 以与 ID 数组进行比较
【发布时间】:2015-03-17 18:39:26
【问题描述】:

早安,

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

到目前为止,我只能想到三个嵌套循环,第一个在 Cars 上,第二个在 ids 数组上的内循环(来自表单)和 ArrayCollection 上的第三个内循环Cars 中的 CarTypes 以检查来自 2nd 循环的值是否存在于 3rd 中。

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

Doctrine 2 ArrayCollection filter method

Doctrine 2, query inside entities

我有自定义存储库,但感觉最好在 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;
            }
        );
}

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

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    对于其他一些语言或架构,将汽车搜索实现为 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;
        }
    }
    

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

    【讨论】:

    • 感谢 redbirdo,它运行良好,我对 Symfony2 和 Doctrine2 还很陌生,所以想更多地远离查询。从那以后我一直无法理解 DQL 语法。
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多