我在Entity中有一个类型数组字段,
MyEntity.php
li
我想在 $ excepcion 字段中选择 QueryBuilder 来选择非空或非空。
我正在努力 的 MyEntityRepository.php
/**
* @var string
*
* @ORM\Column(name="excepcionMenu", type="array", length=255, nullable=true)
*/
private $excepcion;
但是这会返回所有表记录。
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();
}
但这会返回零记录。
数据库中的此字段以这种方式存储值:
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();
}
是否可以使用QueryBuilder执行此操作或使用DQL执行此操作?
非常感谢
更新的解决方案由@Attila Szalay提供
a:0:{} // empty
N; // null
a:2:{i:0;i:2;i:1;i:4;} // not empty or not null
答案 0 :(得分:8)
对我有用的问题的另一个解决方案是:
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();
}
答案 1 :(得分:4)
您的数据在数据库中存储为serialized“string”,因此NULL值将为“N”; string,它不是db引擎的NULL值。
试试这个:
$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();
答案 2 :(得分: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();
简而言之,您需要使用Expr
类which is explained in further detail in the QueryBuilder chapter of Doctrine's documentation。我只是告诉你如何使用它!
答案 3 :(得分:0)
您的存储库方法完全正确。
但是,数组不能为null。如果它为null,那么它不是一个数组:它是null。
解决方案可能是更改列excepcionMenu
的类型。