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);
}
이는 다음과 같이 읽을 수 있습니다.
- 프로세스 매개 변수
- 쿼리의 일부에 AND 문 추가(이전에 다른 위치 문이 추가된 경우)
- 조건을 붙이다
장소와 장소의 차이, 그리고 장소를 추가하는 것에 대해서는 지난번 출처를 읽었을 때와 큰 차이가 없다고 생각합니다.하지만 저는 당신이 독트린의 출처를 읽어보길 권하고 싶습니다.이 방법은 매우 간단하며 설명서의 구멍을 메우는 데 도움이 됩니다(여러 가지가 있습니다).복합적인 곳에 대한 진술에 대해서는, 저 자신도 이것에 대해 궁금해했지만, 아직 필요성이 필요하지 않았습니다.
제 경험으로 볼 때, 저는 가끔 다음과 같은 차이를 보았습니다.
$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
'source' 카테고리의 다른 글
Docker 빌드 컨텍스트 밖의 파일을 포함하는 방법은 무엇입니까? (0) | 2023.08.17 |
---|---|
행용 셀:IndexPath: 호출되지 않음 (0) | 2023.08.17 |
경고: 모듈 리포지토리를 찾을 수 없습니다. (0) | 2023.08.12 |
@types/googlemaps/index.d.ts'는 모듈이 아닙니다. (0) | 2023.08.12 |
FileNotFoundError: [Errno 2] 해당 파일 또는 디렉터리가 없습니다. (0) | 2023.08.12 |