2016-01-12 6 views
9

Ich habe eine Art Array-Feld in Entity,Symfony2, erstellen Querybuilder where-Klausel, nicht leer ist oder nicht null

MyEntity.php

/** 
* @var string 
* 
* @ORM\Column(name="excepcionMenu", type="array", length=255, nullable=true) 
*/ 
private $excepcion; 

Ich möchte einen Querybuilder erhalten wählen nicht leer oder nicht null in $ excepcion Feld.

Ich versuche MyEntityRepository.php

public function findAllExcepcionesByItem($itemId) { 

    $query = $this->createQueryBuilder('p') 
      ->leftJoin('p.item', 'i') 
      ->where('i.id = :actual')->setParameter('actual', $itemId) 
      ->andWhere('p.excepcion IS NOT NULL') 
      ->getQuery(); 

    return $query->getResult(); 
} 

Aber diese gibt alle Datensätze der Tabelle.

public function findAllExcepcionesByItem($itemId) { 

    $query = $this->createQueryBuilder('p') 
      ->leftJoin('p.item', 'i') 
      ->where('i.id = :actual')->setParameter('actual', $itemId) 
      ->andWhere('p.excepcion IS NULL') 
      ->getQuery(); 

    return $query->getResult(); 
} 

Aber das gibt Null Datensätze zurück.

dieses Feld in der Datenbank speichert die Werte in dieser Art und Weise:

a:0:{} // empty 
N; // null 
a:2:{i:0;i:2;i:1;i:4;} // not empty or not null 

Ist es möglich, dies mit Querybuilder zu tun, oder sollte mit DQL getan werden?

Dank viel


AKTUALISIERT Lösung von @Attila Szalay beigetragen

public function findAllExcepcionesByItem($itemId) { 

    $query = $this->createQueryBuilder('p') 
      ->leftJoin('p.item', 'i') 
      ->where('i.id = :actual')->setParameter('actual', $itemId) 
      ->andWhere('p.excepcion != :null')->setParameter('null', serialize(null)) //not null 
      ->andWhere('p.excepcion != :empty')->setParameter('empty', serialize([])) //not empty 
      ->getQuery(); 

    return $query->getResult(); 
} 
+0

Warum $ Excepcion ist Zeichenfolge eingeben und Spaltentyp ist Array? – scoolnico

+0

, weil es mehrere mögliche Optionen speichern muss. Form on Twig rendert mehrere Kontrollkästchen. –

+0

Wissen Sie, dass ein Array in PHP nicht null sein kann? – scoolnico

Antwort

3

Ihre Daten gespeichert als serialized "Zeichenfolge" in Ihrer Datenbank, so NULL-Wert wird ein "N;" string und es ist kein NULL-Wert für db-Engines.

Try this:

$query = $this->createQueryBuilder('p') 
     ->leftJoin('p.item', 'i') 
     ->where('i.id = :actual')->setParameter('actual', $itemId) 
     ->andWhere('p.excepcion != :null')->setParameter('null', 'N;') //not null 
     ->getQuery(); 
+0

Sie haben Recht, und war nicht in dieses Detail gefallen :) Jetzt brauche ich nur überprüfen für 'a: 0: {}' Danke –

+0

Sie können 'serialize (null)' für die NULL-Prüfung anstelle von ''N; 'string und' serialize ([]) 'für leeres Array. – dzsubek

+0

vielen Dank, ich aktualisiert mit voller Lösung Code –

1
$qb = $this->createQueryBuilder('p'); 
$query = $qb->leftJoin('p.item', 'i') 
     ->where('i.id = :actual')->setParameter('actual', $itemId) 
     ->andWhere($qb->expr()->isNotNull("p.excepcion")) 
     ->getQuery(); 

Kurz Sie die Expr Klasse, which is explained in further detail in the QueryBuilder chapter of Doctrine's documentation verwenden müssen. Ich habe dir nur gezeigt, wie man es benutzt!

+0

Vielen Dank, aber das Ergebnis ist genau das gleiche wie ohne reguläre Ausdrücke. Wie '-> andWhere ('p.excepcion IS NOT NULL'). Ich denke, das Problem ist die Art der Feldanordnung. –

0

Ihre Repository-Methode ist völlig korrekt.

Aber ein Array kann nicht null sein. Wenn es null ist, dann ist es kein Array: es ist null. Die Lösung könnte darin bestehen, den Typ der Spalte excepcionMenu zu ändern.

+0

danke @scoolnico, ich habe diese Frage bereits in Ihrem Kommentar zur Hauptfrage beantwortet. –

5

Die andere Lösung für das Problem, das für mich gearbeitet ist:

public function findAllExcepcionesByItem($itemId) { 
    $query = $this->createQueryBuilder('p') 
     ->leftJoin('p.item', 'i') 
     ->where("i.id = :actual")->setParameter("actual", $itemId) 
     ->andWhere("p.excepcion != ''") // NOT EMPTY 
     ->andWhere("p.excepcion IS NOT NULL") // NOT NULL 
     ->getQuery(); 
    return $query->getResult(); 
} 
+0

'-> andWhere (" p.excepcion IN NOT NULL ") // NICHT NULL" IN oder IS? :) – B2GraphiX

Verwandte Themen