web-dev-qa-db-fra.com

Symfony2, créer la clause where du constructeur de requêtes, non vide ou non nulle

J'ai un champ de type tableau dans Entity,

MyEntity.php

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

Je voudrais obtenir un QueryBuilder pour sélectionner pas vide ou pas nul dans $ excepcion champ.

J'essaye 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();
}

Mais cela renvoie tous les enregistrements de table.

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();
}

Mais cela ne renvoie aucun enregistrement.

ce champ dans la base de données stocke les valeurs de cette manière:

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

Est-il possible de le faire avec QueryBuilder ou devrait-on le faire avec DQL?

merci beaucoup


solution MISE À JOUR contribué par @Attila Szalay

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();
}
11
jjgarcía

Vos données stockées sous la forme sérialisé "chaîne" dans votre base de données, donc la valeur NULL sera un "N;" chaîne et ce n'est pas une valeur NULL pour les moteurs db.

Essaye ça:

 $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();
5
dzsubek

L'autre solution au problème qui a fonctionné pour moi est:

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();
}
10
M.J
$qb = $this->createQueryBuilder('p');
$query = $qb->leftJoin('p.item', 'i')
        ->where('i.id = :actual')->setParameter('actual', $itemId)
        ->andWhere($qb->expr()->isNotNull("p.excepcion"))
        ->getQuery();

En bref, vous devez utiliser la classe Expr, qui est expliquée plus en détail dans le chapitre QueryBuilder de la documentation de Doctrine . Je viens juste de vous montrer comment l'utiliser, cependant!

2
Carlos Vergara

Votre méthode de dépôt est totalement correcte.

Mais, un tableau ne peut pas être nul. Si c'est nul, alors ce n'est pas un tableau: c'est nul.

La solution pourrait être de changer le type de la colonne excepcionMenu.

0
scoolnico