2017-11-12 4 views
0

私はクエリで値をバインドするために使用するパラメータの配列を持っています。ダイナミック値をDoctrineとバインドする方法

$params = [ 
      'brandFilter' => $articles['brands'], 
      'categoryFilter' => $articles['categories'], 
      'priceFromFilter' => $articles['prices']['from'], 
      'priceToFilter' => $articles['prices']['to'], 
     ]; 

私の問題は、ユーザーがチェックした内容に依存するため、これらのパラメータの1つまたは複数が空になることがあることです。

私はif !emptyを使用して、私のクエリを行うことができますが、それはすぐに次のように書くと読み醜い次のようになります。

$qb = $this->createQueryBuilder('a'); 
     $qb->select('a'); 

if (!empty($articles['brands']) && !empty($articles['categories']) && !empty($articles['prices']['from']) && !empty($articles['prices']['to'])) { 

    $qb->where('a.brand IN (:brandFilter)') 
     ->andWhere('a.category IN (:categoryFilter)') 
     ->andWhere('a.price BETWEEN :priceFromFilter AND :priceToFilter') 
     ->setParameters($params); 
} 

elseif (!empty($articles['brands']) && !empty($articles['categories'])) { 
    $this->findByBrandsAndCategories($qb, $articles); 

} elseif (!empty($articles['brands']) && empty($articles['categories'])) { 
    $this->findByBrands($qb, $articles); 

} elseif (!empty($articles['categories']) && empty($articles['brands'])) { 
    $this->findByCategories($qb, $articles); 
} 

return $qb->getQuery()->getArrayResult(); 
    } 

それを書くのは本当に長いですし、誰もが条件ブロックを経由するよりも、別の解決策を持っていた場合、私は思っていました?

答えて

0

私は次のようにクエリを生成すると、あなたのニーズに合うことができると思う:

$qb = $this->createQueryBuilder('a'); 

if (!empty($articles['brands'])) { 
    $qb 
     ->andWhere('a.brand IN (:brandFilter)') 
     ->setParameter('brandFilter', $articles['brands']); 
} 

if (!empty($articles['categories'])) { 
    $qb 
     ->andWhere('a.category IN (:categoryFilter)') 
     ->setParameter('categoryFilter', $articles['categories']); 
} 

if (!empty($articles['prices']['from'])) { 
    $qb 
     ->andWhere('a.price >= (:priceFromFilter)') 
     ->setParameter('priceFromFilter', $articles['prices']['from']); 
} 

if (!empty($articles['prices']['to'])) { 
    $qb 
     ->andWhere('a.price <= (:priceToFilter)') 
     ->setParameter('priceToFilter', $articles['prices']['to']); 
} 
+0

おかげ@Samuelウィッキーそれをより読みやすく、スケーラブルで、書くのは苦痛が少ないです – thierrybou

関連する問題