【发布时间】: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