Complex WHERE clauses using the PHP Doctrine ORM

后端 未结 7 1876
长发绾君心
长发绾君心 2020-12-13 09:15

I\'m using the PHP Doctrine ORM to build my queries. However, I can\'t quite seem to figure how to write the following WHERE clause using DQL (Doctrine Query Language):

相关标签:
7条回答
  • 2020-12-13 09:49

    As it seems like you can't do complex queries using DQL, I wrote the following SQL to pass to the andWhere() method:

    $q->andWhere("(category1 IN $subcategory_in_clause
    OR category2 IN $subcategory_in_clause 
    OR category3 IN $subcategory_in_clause) AND TRUE");
    

    Note the "AND TRUE", a hack so that the parser wouldn't ignore the outer parentheses.

    0 讨论(0)
  • 2020-12-13 09:54

    The correct way of doing this can be found at doctrine 2 - query builder conditional queries... If statements? as noted by @Jekis. Here is how to use the expression builder to solve this like in @anushr's example.

    $qb->where($qb->expr()->eq('name', ':name'))
      ->andWhere(
        $qb->expr()->orX(
          $qb->expr()->eq('category1', ':category1'),
          $qb->expr()->eq('category2', ':category2'),
          $qb->expr()->eq('category3', ':category3')
      )
      ->andWhere($qb->expr()->lt('price', ':price')
      ->setParameter('name', 'ABC')
      ->setParameter('category1', 'X')
      ->setParameter('category2', 'X')
      ->setParameter('category3', 'X')
      ->setParameter('price', 10);
    
    0 讨论(0)
  • 2020-12-13 09:58

    In my experience, I have sometimes seen a difference between :

    $q->andWhere("(category1 IN $subcategory_in_clause
                OR category2 IN $subcategory_in_clause 
                OR category3 IN $subcategory_in_clause)");
    

    and

    $q->andWhere("(category1 IN $subcategory_in_clause OR category2 IN $subcategory_in_clause OR category3 IN $subcategory_in_clause)");
    

    The first statement is written on 3 lines, the second, on only one. I didn't believe it but THERE IS A DIFFERENCE !

    0 讨论(0)
  • 2020-12-13 09:59

    As for the difference between where, andwhere, and addwhere, i don't believe there is a significant difference from the last time i read the source. I would encourage you to read the Doctrine source, however. It's really simple, and helps fills in the holes in the documentation (there are many). As for complex where statements, I've wondered this myself but haven't had a need for it yet.

    0 讨论(0)
  • 2020-12-13 10:00

    From my experience, each complex where function is grouped within parenthesis (I'm using Doctrine 1.2.1).

    $q->where('name = ?', 'ABC')
      ->andWhere('category1 = ? OR category2 = ? OR category3 = ?', array('X', 'X', 'X'))
      ->andWhere('price < ?', 10)
    

    produces the following SQL:

    WHERE name = 'ABC' 
      AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
      AND price < 10
    
    0 讨论(0)
  • 2020-12-13 10:15

    andWhere can be summarized as:
    Previously Added Condition(s) Aware WHERE Statement

    You can safely use andWhere inplace of where. (it introduces a very tiny overhead, which is stated below in the 2nd list item.)

    The implementation of andWhere is: (Doctrine 1.2.3)

    public function andWhere($where, $params = array())
    {
        if (is_array($params)) {
            $this->_params['where'] = array_merge($this->_params['where'], $params);
        } else {
            $this->_params['where'][] = $params;
        }
    
        if ($this->_hasDqlQueryPart('where')) {
            $this->_addDqlQueryPart('where', 'AND', true);
        }
    
        return $this->_addDqlQueryPart('where', $where, true);
    }
    

    which can be read as,

    1. Process parameters
    2. append AND statement to where part of the query, if another where statement was added before
    3. append condition
    0 讨论(0)
提交回复
热议问题