php – 如何获得doctrine2实体一对多设置为“活动”的实体

让我们假设博客帖子和评论之间存在OnetoMany doctrine2关联.博客帖子可能有很多评论.每个评论都保持不活动状态,因此隐藏在前端,直到主持人手动激活评论.

我现在正在尝试使用某种安全外观来确保只通过在twig模板中的{{blogpost.comments}}变量的循环中访问它们,只为视图提供“活动”注释.

试图在blogpost实体中使用getComments()方法我试图过滤像这样的注释的ArrayCollection

/**
 * @return ArrayCollection
 */
public function getComments()
{
    return $this->comments->filter(function ($condition) {
        return $condition->getActive() === true;
    });
}

不幸的是,即使关系提取模式设置为“EXTRA_LAZY”,Doctrine也会完全加载每个注释.所以这会以我想避免的方式影响应用程序的性能.

有没有办法在全局隐藏不活动的注释,或者我每次访问视图中的blogpost.comments关系时是否必须注意过滤它们?

解决方法:

您应该使用集合的匹配方法.如果未加载您的集合,它将向SQL查询添加过滤器以仅加载您需要的内容.如果您的集合已经加载,它将过滤PHP数组.

use Doctrine\Common\Collections\Criteria;

public function getComments()
{
    return $this->comments->matching(
        Criteria::create()->where(
            Criteria::expr()->eq('active', true)
        )
    );
}

更多信息:http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html#filtering-collections

问候

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...