source

PHP 독트린 ORM을 사용하는 복잡한 WHERE 절

nicesource 2023. 8. 12. 10:27
반응형

PHP 독트린 ORM을 사용하는 복잡한 WHERE 절

PHP 독트린 ORM을 사용하여 쿼리를 작성하고 있습니다.하지만 DQL(Docrine Query Language)을 사용하여 다음 WHERE 절을 작성하는 방법을 잘 모르겠습니다.

WHERE name='ABC' AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X') 
AND price > 10

괄호의 위치를 지정하려면 어떻게 해야 합니까?

현재 제 PHP 코드에 있는 것은 다음과 같습니다.

->where('name = ?', 'ABC')
->andWhere('category1 = ?', 'X')
->orWhere('category2 = ?', 'X')
->orWhere('category3 = ?', 'X')
->andWhere('price > ?', 10)

하지만 이것은 다음과 같은 것을 만들어냅니다.

WHERE name='ABC' AND category1 = 'X' OR category2 = 'X' OR category3 = 'X' 
AND price > 10

작업 순서로 인해 의도한 결과가 반환되지 않습니다.

또한 "where", "andwhere" 및 "addWhere" 방법 사이에 차이점이 있습니까?

UPDATE OK, DQL을 사용하여 복잡한 쿼리를 할 수 없는 것 같아서 SQL을 수동으로 작성하고 및 Where() 방법을 사용하여 추가하려고 했습니다.하지만 WHERE를 사용하고 있습니다.IN과 독트린은 나의 괄호를 제거하는 것처럼 보입니다.

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

제 경험으로 볼 때, 각 단지는where함수는 괄호 안에 그룹화되어 있습니다(Donction 1.2.1 사용).

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

는 다음 SQL을 생성합니다.

WHERE name = 'ABC' 
  AND (category1 = 'X' OR category2 = 'X' OR category3 = 'X')
  AND price < 10

올바른 방법은 교의 2 - 쿼리 작성기 조건부 쿼리에서 찾을 수 있습니다. 만약 진술한다면? @Jekis가 언급한 것처럼.@anushr의 예와 같이 식을 사용하여 이 문제를 해결하는 방법은 다음과 같습니다.

$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);

DQL을 사용하여 복잡한 쿼리를 수행할 수 없는 것처럼 보이므로 다음 SQL을 작성하여 와 Where() 메서드로 전달했습니다.

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

파서가 외부 괄호를 무시하지 않도록 해킹한 "AND TRUE"에 주목하십시오.

및 다음과 같이 요약할 수 있습니다.
이전에 추가된 조건 인식 WHERE 문

안전하게 및 장소를 대신하여 사용할 수 있습니다.(아래 두 번째 목록 항목에 명시된 매우 작은 오버헤드가 발생합니다.)

의 구현 및 위치: (Docrine 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);
}

이는 다음과 같이 읽을 수 있습니다.

  1. 프로세스 매개 변수
  2. 쿼리의 일부에 AND 문 추가(이전에 다른 위치 문이 추가된 경우)
  3. 조건을 붙이다

장소와 장소의 차이, 그리고 장소를 추가하는 것에 대해서는 지난번 출처를 읽었을 때와 큰 차이가 없다고 생각합니다.하지만 저는 당신이 독트린의 출처를 읽어보길 권하고 싶습니다.이 방법은 매우 간단하며 설명서의 구멍을 메우는 데 도움이 됩니다(여러 가지가 있습니다).복합적인 곳에 대한 진술에 대해서는, 저 자신도 이것에 대해 궁금해했지만, 아직 필요성이 필요하지 않았습니다.

제 경험으로 볼 때, 저는 가끔 다음과 같은 차이를 보았습니다.

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

그리고.

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

첫 번째 문장은 세 줄에, 두 번째 문장은 한 줄에만 쓰여 있습니다.저는 믿지 않았지만 차이가 있습니다!

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

이 변형을 시도해 보시겠습니까, 효과가 있을지는 모르겠지만 시도해 볼 가치가 있습니다.

언급URL : https://stackoverflow.com/questions/1049617/complex-where-clauses-using-the-php-doctrine-orm

반응형