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