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

时间:2016-01-12 12:22:16

标签: php mysql symfony orm doctrine-orm

我在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

4 个答案:

答案 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();

简而言之,您需要使用Exprwhich is explained in further detail in the QueryBuilder chapter of Doctrine's documentation。我只是告诉你如何使用它!

答案 3 :(得分:0)

您的存储库方法完全正确。

但是,数组不能为null。如果它为null,那么它不是一个数组:它是null。

解决方案可能是更改列excepcionMenu的类型。