Doctrine 2 ArrayCollection过滤方法
我可以在使用延迟加载的时候过滤掉在Doctrine 2中的arrayCollection的结果吗? 例如,
// users = ArrayCollection with User entities containing an "active" property $customer->users->filter('active' => TRUE)->first()
目前还不清楚过滤方法是如何使用的。
BorisGuéry在这个post的回答可能会帮助你: Doctrine 2,在实体内部查询
$idsToFilter = array(1,2,3,4); $member->getComments()->filter( function($entry) use ($idsToFilter) { return in_array($entry->getId(), $idsToFilter); } );
Doctrine现在有了Criteria
,它提供了一个用于过滤SQL和PHP集合的API,具体取决于上下文。
更新
这将在接受的答案中实现结果,而不会从数据库中获取所有内容。
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); } }
你的用例是:
$ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) { return $user->getActive() === TRUE; });
如果你添加 – > first(),你将只得到返回的第一个条目,这不是你想要的。
@ Sjwdavies你需要把()传递给USE的variables。 你也可以缩短为in_array返回一个布尔值已经:
$member->getComments()->filter( function($entry) use ($idsToFilter) { return in_array($entry->getId(), $idsToFilter); });
Collection#filter
方法确实会加载所有成员。 在SQL级别过滤将被添加在教条2.3中。