2016-07-07 9 views
1

Sonataには、私は予約管理者がいます。Sonata - 動的プロパティでフィルタを作成する方法

この管理者では、「lastname」、「firstname」または「ref」のようなデータベースにいくつかのフィールドが格納されています。私はまた、私の予約エンティティでこのように定義されている非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"; 
     } 

私は「状態」フィールドにフィルタを定義しようとしましたが、私は得る:

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

はソナタ管理者にフィルタのこの種を定義する方法はありますか?

助けてくれる人!

+0

何も表示されません。 Sonataはすべてのエンティティをメモリにロードしてフィルタリングする必要があります。すべての[フィルタメソッド](https://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/filter_field_definition.html#filter-field-definition)は、QueryBuilderで動作します。 – Lumen

答えて

2

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

:あなたが話しているcomplex conditionのみデータベース内にあるフィールドが含まれていると仮定すると

は、あなたがこのような何かを行うことができますビットクリーナーをコードします。

大きな欠点は、コードの重複が発生することです。ロジックを変更してステータスを判断する場合は、2か所で変更する必要があります。

queryBuilderでは、正しい表から選択するために$aliasが必要です。

関連する問題