在arraycollection中按规范查找和元素的最佳方法

时间:2015-12-06 20:54:22

标签: symfony doctrine-orm

假设我有两个实体:

  • 实体A:位置
  • 实体B:图片

一个位置拥有多个图像(一对多)。图像可能具有属性类型。我经常来一个用例,我需要按类型过滤图像。目前我通过生命周期回调来做到这一点,如下所示:

    /**
     * This functions sets all images when the entity is loaded
     *
     * @ORM\PostLoad
     */
    public function onPostLoadSetImages($eventArgs)
    {
        $this->recommendedForIcons = new ArrayCollection();
        $this->whatYouGetImages    = new ArrayCollection();

        foreach ($this->getImages() as $image) {

            if ('background-image' === $image->getType()->getSlug()) {
                $this->backgroundImage = $image;
            } elseif ('product-icon' === $image->getType()->getSlug()) {
                $this->mainIcon = $image;
            } elseif ('product-image' === $image->getType()->getSlug()) {
                $this->productImage = $image;
            } elseif ('recommended-icon' === $image->getType()->getSlug()) {
                $this->recommendedForIcons->add($image);
            } elseif ('what-you-get-image' === $image->getType()->getSlug()) {
                $this->whatYouGetImages->add($image);
            } elseif ('productshoot-fullcolour' === $image->getType()->getSlug()) {
                $this->productImageFullColor = $image;
            } elseif ('product-overview' === $image->getType()->getSlug()) {
                $this->productOverviewImage = $image;
            }

        }

    }

我想知道是否可以在doctrine数组集合中搜索元素,而不仅仅是键或元素本身。

谢谢。

2 个答案:

答案 0 :(得分:4)

您可以使用回调函数过滤ArrayCollection。例如,您可以在实体中实现一个方法,如:

 public  function  getWhatYouGetImages()
 {
    return $this->getImages()->filter(
        function ($image)  {
            return  ('what-you-get-image' === $image->getType()->getSlug());
        }
    );
}

我建议同样看一下Doctrine Criteria,as described in this answer。我不能为此提出一个例子,因为我不知道Image实体上的getType() - > getSlug()。

希望这个帮助

答案 1 :(得分:3)

ArrayCollection类有 a filter method ,它将谓词(闭包)作为参数。这意味着你可以这样做:

$predicate = function($image){
    'background-image' === $image->getType()->getSlug()    
}

$images = $this->getImages();
$elements = $images->filter($predicate);

$elements现在保存满足谓词的图像中的所有元素。

在内部,它与您的解决方案非常相似;循环所有元素并检查回调...