Orm 条令2阵列收集过滤法

Orm 条令2阵列收集过滤法,orm,doctrine-orm,lazy-loading,arraycollection,Orm,Doctrine Orm,Lazy Loading,Arraycollection,在使用延迟加载时,我是否可以从原则2中的arrayCollection中筛选出结果?比如说, // users = ArrayCollection with User entities containing an "active" property $customer->users->filter('active' => TRUE)->first() 我不清楚过滤方法是如何实际使用的。Boris Guéry在这篇文章中的答案可能会帮助你: 您的用例将是: $A

在使用延迟加载时,我是否可以从原则2中的arrayCollection中筛选出结果?比如说,

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

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

Boris Guéry在这篇文章中的答案可能会帮助你:


您的用例将是:

    $ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) {
                        return $user->getActive() === TRUE;
                    });
如果添加->first(),将只返回第一个条目,这不是您想要的

@Sjwdavies 您需要在传递使用的变量周围放置()。您还可以缩短,因为在_数组中,返回值已经是布尔值:

    $member->getComments()->filter( function($entry) use ($idsToFilter) {
        return in_array($entry->getId(), $idsToFilter);
    });
Collection#filter
方法确实可以加载所有成员。
SQL级别的过滤将添加到doctrine 2.3中。

doctrine现在有
标准
,它提供了一个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); 
  }
}

使用filter方法的唯一问题是,您必须先获取所有数据,然后才能将其筛选出来。您知道有没有一种方法可以在不获取所有数据的情况下执行此操作吗?您好-我正在尝试上述操作,但出现语法错误,您能否更新您的答案?让我感到困惑的是filter返回一个集合。我假设它返回了一个数组,并继续执行$filter[0],结果为空。当我将代码更改为$filtered->first()时,我得到了预期的数据。@ryan关于
标准的回答现在(2014)应该是可接受的答案,因为它可以在SQL级别过滤集合。@tftd哦,是的。我的评论没有不尊重的意思。相反,我的意思是通知读者现在可以使用的新方法。现在2.3已经过时了,这是真的吗?我在文件里没找到。我们现在可以做一些过滤和其他事情,期望集合将过滤应用于查询并推迟查询吗?@Pinetree至少他们这么说:但是仍然方法加载到许多数据,例如计数,加载所有匹配的数据。感谢清除,这实际上会改变sql查询,而不是从数据库中选择所有内容,然后通过循环应用过滤器!请在此处查看:)在集合上使用
indexBy=“xxx”
并在集合上调用
matching
时,似乎出现了问题,此时索引将被丢弃。请注意:
Criteria
仅在使用
fetch=“EXTRA_LAZY”
声明关系时,才按假设工作(SQL而不是通过PHP过滤)
fetch=“EXTRA\u LAZY”
还不能处理所有关系。。。
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); 
  }
}