web-dev-qa-db-ja.com

symfony2、クエリビルダーを作成するwhere句、空でもnullでもない

Entityには1つのタイプの配列フィールドがあります。

MyEntity.php

/**
 * @var string
 *
 * @ORM\Column(name="excepcionMenu", type="array", length=255, nullable=true)
 */
private $excepcion;

QueryBuilderを選択して、not emptyまたはnot nullを取得したい$ 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();
}

しかし、これはすべてのテーブルレコードを返します。

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();
}
11
jjgarcía

データはデータベースに serialized "string"として保存されるため、NULL値は "N;"になります。文字列であり、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();
5
dzsubek

私のために働いた問題の他の解決策は:

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();
}
10
M.J
$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クラスを使用する必要があります DoctrineのドキュメントのQueryBuilderの章で詳しく説明しています 。ただし、使用方法を示しただけです。

2
Carlos Vergara

あなたのリポジトリメソッドは完全に正しいです。

ただし、配列をnullにすることはできません。 nullの場合、配列ではありません。nullです。

解決策は、列のタイプexcepcionMenuを変更することです。

0
scoolnico