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();
}
データはデータベースに 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();
私のために働いた問題の他の解決策は:
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();
}
$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の章で詳しく説明しています 。ただし、使用方法を示しただけです。
あなたのリポジトリメソッドは完全に正しいです。
ただし、配列をnullにすることはできません。 nullの場合、配列ではありません。nullです。
解決策は、列のタイプexcepcionMenu
を変更することです。