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,具体取决于上下文。

http://docs.doctrine-project.org/en/latest/reference/working-with-associations.html#filtering-collections

更新

这将在接受的答案中实现结果,而不会从数据库中获取所有内容。

 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中。