【问题标题】:PHP Doctrine Query AND with either ORPHP Doctrine 查询 AND 与 OR
【发布时间】:2020-02-12 22:26:28
【问题描述】:

一个数据库的产品有很多选项,其中两个是,比如说,选项 1 和选项 2。我需要进行查询(我知道如何构建整个东西,我只是坚持以下逻辑) 将仅显示以下产品:

  1. 如果选项 1 和选项 2 均未选择,则显示所有产品
  2. 如果选择选项 1,则仅显示带有此选项的产品
  3. 如果选择了选项 2,则仅显示带有此选项的产品
  4. 如果选择了选项 1 和选项 2,则仅显示具有这两个选项的产品

我试过了:

function GetProducts(keywords) {
...
    ->andWhere($qb->expr()->orX(
        $qb->expr()->eq('option1', keywords['option1']),
        $qb->expr()->eq('option2', keywords['option2'])
    ))
...
}

keywords['option1'] 和keywords['option2'] 是带有此类选项的复选框中的值 0 或 1。

但结果如下:

  1. 如果选项 1 和选项 2 均未选择,则显示所有产品 - 确定
  2. 如果选择了选项 1,则会显示带有选项 1 的产品以及所有没有这两个选项的产品 - 不是我需要的
  3. 如果选择了选项 2,则会显示带有选项 1 的产品以及所有没有这 2 个选项的产品 - 不是我需要的
  4. 如果选择了选项 1 和选项 2,则会显示所有产品 - 不是我需要的

【问题讨论】:

    标签: php doctrine-query


    【解决方案1】:
    public function getRandomSearch($keywords)
    {
        $em = DatabaseORM::entityManager();
        $qb = $em->createQueryBuilder();
        $qb->select('c')
            ->from('Products\Product', 'c');
    
        if ($keywords['option1'] && !$keywords['option2']) {
            $qb->andWhere($qb->expr()->eq('c.option1', $keywords['option1']));
        }
        elseif (!$keywords['option1'] && $keywords['option2']) {
            $qb->andWhere($qb->expr()->eq('c.option2', $keywords['option2']));
        }
        elseif ($keywords['option1'] && $keywords['option2']) {
            $qb->andWhere($qb->expr()->orX(
                $qb->expr()->eq('c.option1', $keywords['option1']),
                $qb->expr()->eq('c.option2', $keywords['option2'])
            ));
        }
    
        return $qb->getQuery()
            ->getResult();
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 1970-01-01
      相关资源
      最近更新 更多