如何在存储库查询生成器中调用实体方法
How can I call method of entity in a repository querybuilder
我有这样的场景:
一个实体 Person,一个 Person 的存储库和一个 select 表单类型。
我应该以我的 select 表格作为唯一活跃的人。
在实体中有一个 public 方法 "isActive" 检查一个人是否有权访问我的私人区域。此方法 return true or false 并且不是 db 中的列 table,它是计算出来的。
我需要从 Person 存储库中的查询生成器访问此标志。
可能吗?
在存储库中我的查询生成器的代码下方。
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 中。有什么想法吗?
不可能将自定义 PHP 方法调用为 SQL 查询,因此 Doctrine 的 QueryBuilder 不允许这样做。您将需要将 isActive
作为数据库字段(或自定义方法),或者使用 QueryBuilder 条件重现您的 getIsActive
方法。
好的,您不能在查询生成器上调用实体方法,但可以在查询结果上调用。 Doctrine 将使用从数据库返回的数据来滋润您的实体对象。
获得结果后,您可以对水合实体调用 isActive() 方法。
您尝试实现它的方式(获取表单的查询构建器),您将需要在数据库中有一个 isActive 列 table 并添加一个 'where' 子句,如下所示:
public function getQueryBuilderForEventRegistration()
{
$queryBuilder = $this->createQueryBuilder('e')
->where('e.isActive', true)
->orderBy('e.surname', 'asc')
->addOrderBy('e.name', 'asc');
return $queryBuilder;
}
您可以使用过滤功能过滤模板上的数组。
在我的例子中,我有一个实体,它有一个 canBeProcessed 方法(这取决于很多事情)。
因此,当我只想在控制器的索引方法中显示
的那些记录时
"canBeProcessed" 我用这个 :
{% for emitted_note in pagination|filter( emitted_note => emitted_note.canBeProcessed == true ) %}
<tr><td>{{emitted_note.data}}</td><tr>
{% endfor %}
这是 twig 文档。
https://twig.symfony.com/doc/2.x/filters/filter.html
此致。
我有这样的场景: 一个实体 Person,一个 Person 的存储库和一个 select 表单类型。
我应该以我的 select 表格作为唯一活跃的人。
在实体中有一个 public 方法 "isActive" 检查一个人是否有权访问我的私人区域。此方法 return true or false 并且不是 db 中的列 table,它是计算出来的。
我需要从 Person 存储库中的查询生成器访问此标志。 可能吗? 在存储库中我的查询生成器的代码下方。
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 中。有什么想法吗?
不可能将自定义 PHP 方法调用为 SQL 查询,因此 Doctrine 的 QueryBuilder 不允许这样做。您将需要将 isActive
作为数据库字段(或自定义方法),或者使用 QueryBuilder 条件重现您的 getIsActive
方法。
好的,您不能在查询生成器上调用实体方法,但可以在查询结果上调用。 Doctrine 将使用从数据库返回的数据来滋润您的实体对象。
获得结果后,您可以对水合实体调用 isActive() 方法。
您尝试实现它的方式(获取表单的查询构建器),您将需要在数据库中有一个 isActive 列 table 并添加一个 'where' 子句,如下所示:
public function getQueryBuilderForEventRegistration()
{
$queryBuilder = $this->createQueryBuilder('e')
->where('e.isActive', true)
->orderBy('e.surname', 'asc')
->addOrderBy('e.name', 'asc');
return $queryBuilder;
}
您可以使用过滤功能过滤模板上的数组。 在我的例子中,我有一个实体,它有一个 canBeProcessed 方法(这取决于很多事情)。 因此,当我只想在控制器的索引方法中显示
的那些记录时"canBeProcessed" 我用这个 :
{% for emitted_note in pagination|filter( emitted_note => emitted_note.canBeProcessed == true ) %}
<tr><td>{{emitted_note.data}}</td><tr>
{% endfor %}
这是 twig 文档。
https://twig.symfony.com/doc/2.x/filters/filter.html
此致。