我有这种情况:实体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中。任何想法?
好的,因此您无法在查询生成器上调用实体方法,但可以在查询结果上调用。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] 删除。
我来说两句