gpt4 book ai didi

php - Sonata - 如何创建动态属性过滤器?

转载 作者:行者123 更新时间:2023-12-02 04:08:19 25 4
gpt4 key购买 nike

在索纳塔中,我有一个预订管理员。

在此管理中,我将一些字段存储到数据库中,例如“姓氏”、“名字”或“引用”。我还有一个“状态”字段,它不是数据库存储的,它在我的预订实体中的定义如下。

    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";
}

我尝试在“state”字段上定义过滤器,但我得到:

[Semantical Error] line 0, col 87 near 'state = :sta': Error: Class MyBundle\Entity\Booking has no field or association named state

有没有办法在 Sonata Admin 中定义这种过滤器?

感谢帮助!

最佳答案

正如 Lumen 已经评论的那样,所有过滤器都与 QueryBuilder 一起使用,因此尝试直接过滤数据库中不存在的内容是不可能的。

假设您正在讨论的复杂条件仅包含数据库中的字段,您可以执行以下操作:

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'),
));
}

当然,您可以将回调移至单独的函数以使代码更简洁。

这样做的一个很大的缺点是,您会得到一些代码重复,因此,如果您的确定状态的逻辑发生变化,则需要在两个地方进行更改。

请注意,在 queryBuilder 中,您需要 $alias 以确保您从正确的表中进行选择。

关于php - Sonata - 如何创建动态属性过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38239986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com