jjg*_*cía 11 php mysql orm symfony doctrine-orm
我在Entity中有一个类型数组字段,
MyEntity.php
/**
* @var string
*
* @ORM\Column(name="excepcionMenu", type="array", length=255, nullable=true)
*/
private $excepcion;
Run Code Online (Sandbox Code Playgroud)
我想让一个QueryBuilder在$ excepcion字段中选择不为空或不为空.
我正在尝试 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();
}
Run Code Online (Sandbox Code Playgroud)
但是这会返回所有表记录.
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();
}
Run Code Online (Sandbox Code Playgroud)
但这会返回零记录.
数据库中的此字段以这种方式存储值:
a:0:{} // empty
N; // null
a:2:{i:0;i:2;i:1;i:4;} // not empty or not null
Run Code Online (Sandbox Code Playgroud)
是否可以使用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();
}
Run Code Online (Sandbox Code Playgroud)
M.J*_*M.J 10
解决这个问题的另一个解决方案是:
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();
}
Run Code Online (Sandbox Code Playgroud)
您的数据在数据库中存储为序列化的“字符串”,因此 NULL 值将是“N;” 字符串,它不是数据库引擎的 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();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16666 次 |
最近记录: |