Blog スタッフブログ

EC-CUBE システム開発

[EC-CUBE]クエリビルダのソートでnullを最後にする方法

システム開発担当のTFです。

やり方

  • SELECT で case を用いて null なら 1 になるカラムを追加
  • orderByでそのカラムをASCする

サンプル


	public function getSearchQB($getData = [])
	{
		$qb = $this->createQueryBuilder("rp");
		
		$qb->leftJoin("Eccube\Entity\Category", "ca", \Doctrine\ORM\Query\Expr\Join::WITH, 'ca.id = rp.Category');
		$qb->leftJoin("Eccube\Entity\ProductClass", "pc", \Doctrine\ORM\Query\Expr\Join::WITH, 'pc.Product = rp.Product');
		
		$qb->addSelect('(case when ca.name IS NULL then 1 else 0 end) as HIDDEN category_name_is_null ');
		
		if( isset($getData['multi']) && !empty($getData['multi']) ){
			$qb->andWhere("ca.name LIKE :category_name OR pc.code LIKE :product_code");
			$qb->setParameter("category_name", '%'.$getData['multi'].'%');
			$qb->setParameter("product_code", '%'.$getData['multi'].'%');
		}
		
		$qb->orderBy("category_name_is_null", 'ASC');
		$qb->addOrderBy("ca.name", 'ASC');
		$qb->addOrderBy("pc.code", 'ASC');
		$qb->addOrderBy("rp.id", 'ASC');
		
		return $qb;
	}