2016-10-14 3 views
1

Ich versuche Doctrine SQLFilter zu erstellen. Ich muss nach "gelöscht" Feld filtern. Aber ich möchte Filter mit beiden (wahr und falsch) Werten auch machen.Array als Parameter in Doctrine SQLFilter

Etwas wie folgt aus:

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

Aber wenn ich versuche, Array von posible Filterwerte zu setzen in der Steuerung

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

Ich erhalte eine Fehlermeldung 500

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

Diese ist eine klare Situation. Aber nach allem WIE man Array von Params zu meinem SQL-Filter senden?

UPD nach Dmitry Antwort: Das ist nicht wirklich, was ich wollte. Sagen wir: Was, wenn ich nach wenigen Feldwerten filtern wollte? Für Aufzeichnungen von 2015 und 2016 zum Beispiel ... Also muss ich eine Art Array von Jahren in -> setParameter einstellen. Aber es wollen nur Saiten! Und sendet einen Fehler, wenn ich versuche, etwas anderes einzustellen. Wie lösen Sie das?

Oder noch komplizierteres Beispiel. Was ist, wenn ich nach relationalem Feld filtern muss? In diesem Fall muss ich die Entity als Parameter des Filters festlegen. Oder sogar ArrayCollection von Entitäten!

Für jetzt entscheide ich mich wie folgt: Ich json_encode Array vor dem SetParameter in Controller. Und dann json_decode es in der Filterklasse. ABER! Dort in Filterklasse muss ich noch einen Schritt machen. Ich muss single und doublequotes aus json string entfernen. Weil sie von setParameter zur Escapezeichenfolge hinzugefügt wurden (deshalb lieben wir es))).

Code-Hacks wie diese nennen wir "Krücken" hier in Russland. Also würde ich gerne von ihnen zu vermeiden und schreiben eleganter Code)

+0

Oder gibt es eine andere Möglichkeit, einen Filter zu verwenden, um viele Male mit verschiedenen Parametern abzufragen? – avkryukov

Antwort

0

Machen Sie IN statt zu vergleichen.

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

Sie haben immer noch den 'PDO :: quote()' Fehler. Das erste Problem besteht darin, einen Array-Parameter abrufen zu können, der anscheinend noch nicht unterstützt wird –

Verwandte Themen