我可以在使用延迟加载时从Doctrine 2中的arrayCollection中过滤掉结果吗?例如,
// users = ArrayCollection with User entities containing an "active" property
$customer->users->filter('active' => TRUE)->first()
我不清楚滤镜方法是如何实际使用的。
答案 0 :(得分:115)
Doctrine现在有Criteria
,它提供了一个API,用于使用SQL和PHP过滤集合,具体取决于上下文。
<强>更新强>
这将在接受的答案中实现结果,而无需从数据库中获取所有内容。
use Doctrine\Common\Collections\Criteria;
/**
* @ORM\Entity
*/
class Member {
// ...
public function getCommentsFiltered($ids) {
$criteria = Criteria::create()->where(Criteria::expr()->in("id", $ids));
return $this->getComments()->matching($criteria);
}
}
答案 1 :(得分:80)
BorisGuéry在这篇文章中回答,可能会对你有所帮助: Doctrine 2, query inside entities
$idsToFilter = array(1,2,3,4);
$member->getComments()->filter(
function($entry) use ($idsToFilter) {
return in_array($entry->getId(), $idsToFilter);
}
);
答案 2 :(得分:12)
您的使用案例将是:
$ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) {
return $user->getActive() === TRUE;
});
如果你添加 - &gt; first(),你只会得到第一个返回的条目,这不是你想要的。
@ Sjwdavies 你需要在传递给USE的变量周围放置()。你也可以缩短为in_array return的布尔值:
$member->getComments()->filter( function($entry) use ($idsToFilter) {
return in_array($entry->getId(), $idsToFilter);
});
答案 3 :(得分:-1)
Collection#filter
方法确实非常渴望加载所有成员。
SQL级别的过滤将在doctrine 2.3中添加。