[英]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.