[英]Sonata - How to create filter on dynamic property?
进入索纳塔,我有一个预订管理员。
在此Admin中,我将一些字段存储到数据库中,如“lastname”,“firstname”或“ref”。 我还有一个字段“status”,它是非DB存储的,它在我的预订实体中定义如下。
public function getState(){
if (/*Complex condition*/)
return 'canceled_not_refund';
else if (/*Complex condition*/)
return 'canceled';
else if (/*Complex condition*/)
return "no-payment";
else if (/*Complex condition*/)
return "partial_payment";
else if (/*Complex condition*/)
return "ok";
else if(/*Complex condition*/)
return "ended";
}
我试图在“州”字段上定义一个过滤器,但我得到:
[语义错误]第0行,第87行附近'state =:sta':错误:类MyBundle \\ Entity \\ Booking没有字段或关联名为state
有没有办法在Sonata Admin中定义这种过滤器?
求救!
正如Lumen已经评论过的那样,所有过滤器都与QueryBuilder一起使用,因此尝试直接过滤不在数据库中的东西是不可能的。
假设您所讨论的complex condition
仅包含数据库中的字段,您可以执行以下操作:
protected function configureDatagridFilters(DatagridMapper
$datagridMapper)
{
$datagridMapper
->add('status', 'doctrine_orm_callback', array(
'label' => 'Payment Status',
'callback' => function($queryBuilder, $alias, $field, $value) {
if ($value['value'] == 'canceled_not_refund') {
$queryBuilder->andWhere($alias . '.columnA = :some_value');
$queryBuilder->andWhere($alias . '.columnB = :other_value');
$queryBuilder->setParameter('some_value', 'some');
$queryBuilder->setParameter('other_value', 'other');
} elseif ($value['value'] == 'canceled') {
$queryBuilder->andWhere($alias . '.columnA = :some_value');
$queryBuilder->andWhere($alias . '.columnB = :other_value');
$queryBuilder->setParameter('some_value', 'some');
$queryBuilder->setParameter('other_value', 'other');
}
}
), 'choice', array('choices' => array(
'' => '', // Empty option to not filter anything
'canceled_not_refund' => 'Canceled without refund',
'canceled' => 'Canceled'),
));
}
当然,您可以将回调移动到单独的函数,以使代码更清晰。
这样做的一个很大的缺点是你得到了一些代码重复,所以如果你的逻辑改变以确定状态,它需要在2个地方改变。
请注意,在queryBuilder中,您需要$alias
以确保从右表中进行选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.