Doctrine 2 ArrayCollection过滤方法

时间:2011-11-30 23:11:39

标签: orm doctrine-orm lazy-loading arraycollection

我可以在使用延迟加载时从Doctrine 2中的arrayCollection中过滤掉结果吗?例如,

// users = ArrayCollection with User entities containing an "active" property
$customer->users->filter('active' => TRUE)->first()

我不清楚滤镜方法是如何实际使用的。

4 个答案:

答案 0 :(得分:115)

Doctrine现在有Criteria,它提供了一个API,用于使用SQL和PHP过滤集合,具体取决于上下文。

https://www.doctrine-project.org/projects/doctrine-orm/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); 
  }
}

答案 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中添加。