簡體   English   中英

Sonata - 如何在動態屬性上創建過濾器?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM