【发布时间】:2016-04-17 01:30:56
【问题描述】:
我在实体中有一个类型数组字段,
MyEntity.php
/**
* @var string
*
* @ORM\Column(name="excepcionMenu", type="array", length=255, nullable=true)
*/
private $excepcion;
我想要一个 QueryBuilder 在 $excepcion 字段中选择 not empty 或 not null。
我在努力 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();
}
但这会返回所有表记录。
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();
}
但这会返回零记录。
数据库中的这个字段以这种方式存储值:
a:0:{} // empty
N; // null
a:2:{i:0;i:2;i:1;i:4;} // not empty or not null
是否可以使用 QueryBuilder 来完成,还是应该使用 DQL 来完成?
非常感谢
更新的解决方案由@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();
}
【问题讨论】:
-
为什么$excepcion是字符串类型而列类型是数组?
-
因为它必须保存几个可能的选项。 Twig 上的表单呈现多个复选框。
-
你知道PHP中数组不能为空吗?
-
我知道,但是教义中的数组类型并不完全是php中的数组。去掉实体中字段定义的
nullable=true,结果还是一样,新建一个空项,数据库中存储的值还是N;,查询结果也是。
标签: php mysql symfony orm doctrine-orm