代码之家  ›  专栏  ›  技术社区  ›  McFlooz

如何将动力学价值观与学说结合起来

  •  0
  • McFlooz  · 技术社区  · 7 年前

    我有一个参数数组,用于绑定查询中的值。

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

    我的问题是,有时这些参数中的一个或几个可能为空,因为这取决于用户检查的内容。

    我可以使用 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();
        }
    

    写起来真的很长,我想知道除了通过条件块,是否还有其他解决方案?

    1 回复  |  直到 3 年前
        1
  •  0
  •   Samuel Wicky    7 年前

    我认为按如下方式生成查询可以满足您的需要:

    $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']);
    }