【问题标题】:How can I call method of entity in a repository querybuilder如何在存储库查询构建器中调用实体的方法
【发布时间】:2016-04-27 13:39:29
【问题描述】:

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

我应该在我的选择表格中只接受活跃的人。

在实体中有一个公共方法“isActive”,用于检查人员是否有权访问我的私人区域。该方法返回真假,不是db表中的列,是计算出来的。

我需要从 Person 存储库中的 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 中。有什么想法吗?

【问题讨论】:

  • 我不知道这是否可能,但是您可以在控制器中执行此操作,并将参数添加到您的函数中:getQueryBuilderForEventRegistration($param) 并使用 param 执行您想要的操作
  • 您的自定义函数有多复杂?

标签: symfony query-builder


【解决方案1】:

好的,所以你不能在查询生成器上调用实体方法,但你可以在查询结果上调用。 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;
}

【讨论】:

  • 感谢您的回答,但是一旦我从查询生成器中获得结果,如何在类型生成器中调用生成的过滤数组?
  • 在表单中,除了构建您需要的查询之外,您无法对结果执行任何操作。一旦你有了你的 querybuilder 对象,你可以调用 $queryBuilder->getResult() 来返回一个对象数组。然后,您可以遍历它们并在对象上调用 ->isActive() 方法。
  • 但是如果我的 QueryBuilder 返回一个数组,我该如何将它放入我的 typeform 结构中?
  • 您的查询生成器将只返回一个数组一次 ->find()、->findBy() 等被调用...如果您希望表单元素结果通过 isActive 过滤,您最好添加为您的表添加一个 isActive 列,然后您可以将条件构建到查询构建器中。
  • Active 标志取决于几件事,添加包含此信息的列会迫使我在我的应用程序中添加大量侦听器。糟糕,我写了 querybuilder 但我想写存储库。请检查我编辑的问题。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用过滤器功能来过滤模板上的数组。 就我而言,我有一个具有 canBeProcessed 方法的实体(这取决于很多事情)。 所以,当我想在控制器的 index 方法中只显示那些记录时

    “canBeProcessed”我用这个:

    {% 用于分页中的发出的笔记|过滤器(发出的笔记 => 发出的笔记.canBeProcessed == 真) %}

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

    {% endfor %}

    这是 twig 文档。

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

    问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2016-11-09
      相关资源
      最近更新 更多