如何在存储库querybuilder

时间:2016-04-27 13:39:30

标签: symfony query-builder

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

我应该只接受我的选择表格。

在实体中有一个公共方法“isActive”,用于检查一个人是否有权访问我的私人区域。此方法返回true或false,并且不是db表中的列,而是计算它。

我需要从Person存储库中的querybuilder访问此标志。 可能吗? 低于存储库中我的querybuilder的代码。

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

    return $queryBuilder;
}

和实体Person中的公共方法我必须访问:

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中。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

无法将自定义PHP方法称为SQL查询,因此Doctrine的QueryBuilder不允许这样做。您需要将isActive作为数据库字段(或自定义方法),或者使用QueryBuilder条件重现getIsActive方法。

答案 1 :(得分:0)

好的,所以你不能在查询构建器上调用实体方法,但你可以在查询结果上。 Doctrine将使用从数据库返回的数据来保存您的实体对象。

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

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

true

答案 2 :(得分:0)

您可以使用过滤器功能过滤模板上的阵列。 在我的情况下,我有一个具有canBeProcessed方法的实体(取决于很多东西)。 因此,当我想在控制器的索引方法中仅显示那些

的记录时

“ canBeProcessed”我使用这个:

{在分页|过滤器中为emitted_note占%(emitted_note => emitted_note.canBeProcessed == true)%}

        <tr><td>{{emitted_note.data}}</td><tr>

{%endfor%}

这是树枝文档。

https://twig.symfony.com/doc/2.x/filters/filter.html

致谢。