Symfony2,创建querybuilder where子句,不为空或不为null

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)


dzs*_*bek 5

您的数据在数据库中存储为序列化的“字符串”,因此 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)