如何在存储库querybuilder中调用实体的方法

巴托洛涅夫五世

我有这种情况:实体Person,Person的存储库和选择表单类型。

我应该只选择活跃的人。

在实体中,有一个公共方法“ isActive”,该方法检查某个人是否具有在我的私有区域中访问的权限。此方法返回true或false,它不是db表中的一列,而是通过计算得出的。

我需要从个人存储库中的querybuilder访问此标志。是否可以?在存储库中我的querybuilder的代码下面。

public function getQueryBuilderForEventRegistration()
{
    $queryBuilder = $this->createQueryBuilder('e')->orderBy('e.surname', 'asc')->addOrderBy('e.name', 'asc');

    return $queryBuilder;
}

并且实体Person中的public方法必须访问:

public function getIsActive()
{
    if (empty($this->getUser()))
    {
        return false;
    }

    if (!$this->getUser()->isEnabled())
    {
        return false;
    }

    /* @var $service \Siderweb\SubscriptionBundle\Entity\UserService */
    foreach ($this->getUser()->getServices() as $service)
    {
        if (!$service->getIsExpired())
        {
            return true;
        }
    }

    return false;
}

和我的类型:

$builder->add('personExist', 'entity', array(
            'class' => 'MyAppUserBundle:Person',
            'property' => 'name',
            'required' => false,
            'multiple' => false,
            'mapped' => false,
            'empty_value' => '-- New person --',
            'query_builder' => function(PersonRepository $repo) use ($options) {
                return $repo->getQueryBuilderForEventRegistration();
            }
        ))

按照建议,我编辑我的存储库是这样的:

 public function getQueryBuilderForEventRegistration(Company $company = null, Event $event = null, $emailFilter = null)
{
    $queryBuilder = $this->createQueryBuilder('e')->orderBy('e.surname', 'asc')->addOrderBy('e.name', 'asc');

    $people = $queryBuilder->getQuery()->execute();
    $peopleToShow = array();

    foreach ($people as $person)
    {
        if ($person->getIsActive())
        {
            array_push($peopleToShow, $person);
        }
    }

    return $peopleToShow;
}

但是现在我不知道如何将该数组放入我的typeForm中。任何想法?

LMS94

好的,因此您无法在查询生成器上调用实体方法,但可以在查询结果上调用。Doctrine将使用从数据库返回的数据对您的实体对象进行水合处理。

获得结果后,可以在水合实体上调用isActive()方法。

尝试实现此方法的方式(获取表单的查询生成器),您将需要在数据库表中添加一个isActive列,并添加一个“ where”子句,如下所示:

public function getQueryBuilderForEventRegistration()
{
    $queryBuilder = $this->createQueryBuilder('e')
        ->where('e.isActive', true)
        ->orderBy('e.surname', 'asc')
        ->addOrderBy('e.name', 'asc');

    return $queryBuilder;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从存储库获取时,Doctrine如何在不调用__construct方法的情况下创建实体?

如何在symfony2中访问实体的存储库方法?

如何在 Loopback 4 存储库中调用 MongoDB 的“$inc”?

如何在实体框架中使用数据库优先方法使用存储库模式

您如何在#each中的Collection实体上调用方法

如何从Linux存储库中调用此方法?

如何在C#中的存储库中设置某些实体属性?

如何在类似Symfony QueryBuilder的类中调用函数

如何在实体框架中同时使用表值和标量参数调用存储过程

以后如何在调用save()的相同方法中使用Jpa存储库save()中的结果对象?

如何在实体类中存储数据库名称

如何在关系数据库中存储自定义实体属性

Doctrine 自定义实体存储库 (QueryBuilder)

如何在HashMap中存储方法指针并调用它们

如何在Java中模拟MongoDB存储库方法

如何在异步存储库方法中返回空的IQueryable

如何在存储库中选择此实体

如何在Android Studio中的.so库上调用方法

如何在存储过程中调用创建数据库?

如何在JDBC中调用存储过程

如何在Strongloop中调用存储过程

如何在没有实体和JPA存储库的情况下在Spring中运行本机SQL查询?

如何在JSDoc中引用存储库?

如何在存储库中搜索单词?

如何在化石中删除存储库?

如何在存储库中设置 flexform

实体framewrok如何在数据库优先方法中确定主键

Doctrine 如何扩展自定义存储库并从 Doctrine 实体管理器调用扩展存储库

如何在实体框架中运行存储过程