【问题标题】:Doctrine 2 ArrayCollection filter methodDoctrine 2 ArrayCollection 过滤方法
【发布时间】:2012-01-10 04:27:03
【问题描述】:

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

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

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

【问题讨论】:

  • 但是还是方法加载到很多数据,比如count,加载所有匹配的数据。

标签: orm doctrine-orm lazy-loading arraycollection


【解决方案1】:

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); 
  }
}

【讨论】:

【解决方案2】:

Boris Gué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);
    }
); 

【讨论】:

  • 使用 filter 方法的唯一问题是你必须先获取所有数据才能将其过滤掉,不知道有没有办法做到这一点而不获取所有数据?
  • 您好 - 我正在尝试上述方法,但遇到语法错误,您能更新您的答案吗?
  • 让我觉得过滤器的东西返回一个集合。我认为它返回了一个数组并继续执行 $filtered[0],结果为 null。当我将代码更改为 $filtered->first() 时,我得到了预期的数据。
  • @ryan 关于Criteria 的答案现在(2014 年)应该是公认的答案,因为它可以在 SQL 级别过滤集合。
  • @tftd 哦,是的。我的评论没有不尊重的意思。相反,我的意思是通知读者现在可用的新方法。
【解决方案3】:

你的用例是:

    $ArrayCollectionOfActiveUsers = $customer->users->filter(function($user) {
                        return $user->getActive() === TRUE;
                    });

如果你添加 ->first() 你只会得到第一个返回的条目,这不是你想要的。

@Sjwdavies 您需要将 () 放在传递给 USE 的变量周围。您也可以缩短为 in_array 返回的布尔值:

    $member->getComments()->filter( function($entry) use ($idsToFilter) {
        return in_array($entry->getId(), $idsToFilter);
    });

【讨论】:

    【解决方案4】:

    Collection#filter 方法确实急切地加载所有成员。 在学说 2.3 中将添加 SQL 级别的过滤。

    【讨论】:

    • 现在 2.3 已经发布,这是真的吗?我在文档中没有找到它。我们现在可以做过滤器和其他事情,期望集合将过滤应用于查询并推迟查询吗?
    • @Pinetree 至少他们是这么说的:docs.doctrine-project.org/en/latest/reference/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多