假设我有两个实体:
一个位置拥有多个图像(一对多)。图像可能具有属性类型。我经常来一个用例,我需要按类型过滤图像。目前我通过生命周期回调来做到这一点,如下所示:
/**
* 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数组集合中搜索元素,而不仅仅是键或元素本身。
谢谢。
答案 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
现在保存满足谓词的图像中的所有元素。
在内部,它与您的解决方案非常相似;循环所有元素并检查回调...