Symfony2, créer querybuilder clause where, pas de vide ou n'est pas null
J'ai un tableau de type champ de l'Entité, en
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 null dans $excepcion champ.
Je suis en train
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 la 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 renvoie zéro des enregistrements.
ce champ dans la base de données stocke les valeurs de cette façon:
a:0:{} //empty
N; //null
a:2:{i:0;i:2;i:1;i:4;} //not empty or not null
Est-il possible de faire cela avec le QueryBuilder ou devrait être fait avec DQL?
merci beaucoup
Mise à JOUR de la solution 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();
}
Pourquoi $excepcion est une chaîne de frappe et de la colonne est de type tableau?
car il a pour but de sauver plusieurs options possibles. Formulaire Twig rend plusieurs cases à cocher.
Savez-vous qu'un tableau ne peut pas être nulle en PHP?
Je sais, mais le type de tableau dans la doctrine n'est pas exactement un tableau en php. Retrait
car il a pour but de sauver plusieurs options possibles. Formulaire Twig rend plusieurs cases à cocher.
Savez-vous qu'un tableau ne peut pas être nulle en PHP?
Je sais, mais le type de tableau dans la doctrine n'est pas exactement un tableau en php. Retrait
nullable=true
de la définition d'un champ dans l'entité, le résultat est le même, pour créer un nouvel item vide, la valeur stockée dans la base de données est toujours N;
et le résultat de la requête.
OriginalL'auteur jjgarcía | 2016-01-12
Vous devez vous connecter pour publier un commentaire.
Vos données stockées en tant que sérialisé "string" dans votre base de données si la valeur NULL sera un "N;" de la chaîne et il n'est pas une valeur NULL pour les moteurs de base de données.
Essayez ceci:
a:0:{}
merciVous pouvez utiliser
serialize(null)
NULL vérifier au lieu de'N;'
chaîne etserialize([])
de tableau vide.merci beaucoup, j'ai mis à jour avec la solution complète du code
OriginalL'auteur dzsubek
L'autre solution pour le problème qui a travaillé pour moi est:
->andWhere("p.excepcion IN NOT NULL") // NOT NULL
Ou EST ? 🙂OriginalL'auteur M.J
En bref, vous devez utiliser le
Expr
classe, ce qui est expliqué plus en détail dans le QueryBuilder chapitre de la documentation de Doctrine. Je viens de vous montrer comment l'utiliser, cependant!->andWhere('p.excepcion IS NOT NULL')
. Je pense que le problème est le type de tableau champ.OriginalL'auteur Carlos Vergara
Votre référentiel méthode est tout à fait correcte.
Mais, un tableau ne peut pas être null. Si c'est null, alors il n'est pas un tableau: c'est la valeur null.
La solution pourrait être de modifier le type de la colonne
excepcionMenu
.OriginalL'auteur scoolnico