2016-10-14 30 views
1

Doctrine SQLFilterを作成しようとしています。私は "削除"フィールドのためにフィルタリングする必要があります。しかし、私は両方の(真と偽の)値でもフィルタを動作させたい。Doctrine SQLFilterのパラメータとしての配列

このような何か:

<?php 

namespace Rem\CostsBundle\Doctrine; 

use Doctrine\ORM\Mapping\ClassMetadata; 
use Doctrine\ORM\Query\Filter\SQLFilter; 

class ItemDeletedFilter extends SQLFilter 
{ 

    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias) 
    { 
     if ($targetEntity->getReflectionClass()->name != 'Rem\CostsBundle\Entity\Item') { 
      return ''; 
     } 

     $fdata = $this->getParameter('deleted'); 

     $filter = '1<>1'; 
     foreach ($fdata as $param) { 
      $filter .= sprintf('OR %s.deleted = %s', $targetTableAlias, $param); 
     } 

     return $filter; 
    } 
} 

しかし、私はエラー500

Warning: PDO::quote() expects parameter 1 to be string, array given 

これを取得

$filters 
    ->enable('costs_item_deleted') 
    ->setParameter('deleted', [true, false]);  

コントローラでかのうフィルタ値の配列を設定しようとしているとき明確な状況です。しかし、すべての後に私のSQLフィルタにparamsの配列を送信する方法は?

UPDドミトリー後回答:これは私が望んでいたものではありません。言いましょう:もし私がフィールドのいくつかの値でフィルタリングしたいのであれば?たとえば、2015年と2016年のレコードの場合は、 - > setParameterで配列の何らかの並べ替えを設定する必要があります。しかし、それは弦だけが欲しい!私は別のものを設定しようとしているときにエラーを送信します。 これをどのように解決しますか?

さらに複雑な例です。リレーショナルフィールドでフィルタリングする必要がある場合はどうなりますか?この場合、フィルタのパラメータとしてエンティティを設定する必要があります。あるいは、エンティティのArrayCollection!

今のところ私はこれを次のように決めています。json_encode配列を設定してから、コントローラのsetParameterに設定してください。そして、それをFilterクラスでjson_decodeします。しかし! Filterクラスでは、もう1つのステップを行う必要があります。 jsonの文字列から単一引用符や二重引用符を削除する必要があります。これらはsetParameterによってエスケープ文字列に追加されたためです(それが私たちが好きな理由)))。

ロシアでは、このようなコードハッキングを「松葉杖」と呼んでいます。だから私はそれらを避け、より洗練されたコードを書く)

+0

また、1つのフィルタを適用してさまざまなパラメータで何回もクエリを実行する別の方法がありますか? – avkryukov

答えて

0

を比較するのではなく、それを作る。

foreach ($fdata as $param) { 
    $filter .= sprintf('OR %s.deleted IN (%s)', $targetTableAlias, param); 
} 
+0

あなたはまだ 'PDO :: quote()'エラーがあります。最初の問題は、まだサポートされていない配列パラメータを取得できることです –

関連する問題