2013-06-15 2 views
2

symfony 1.4.8에서 doctrine 1.2를 사용합니다. 여기 내 코드입니다 : doctrine 쿼리가 어떻게 빌드되었는지 정보를 얻는 방법

private function getWithMaxProductsQ($limit){ 
    $query = Doctrine_Query::create() 
          ->select('m.name, COUNT(p.manufacturer_id) AS c') 
          ->from('manufacturer m') 
          ->innerJoin('m.Product p') 
          ->where('p.is_published = 1') 
          ->addWhere('p.is_available = 1') 
          ->groupBy('p.manufacturer_id') 
          ->orderBy('c DESC') 
          ->limit($limit); 
    //die($query->getSqlQuery()); 
    return $query; 
} 
public function getManufacturersForCategoryDeep(Category $cat, $limit = 7){ 
    $ids = $cat->getDescendantsAndMeIds(); 
    $q = $this->getWithMaxProductsQ($limit); 
    $q->innerJoin('p.Category c')->whereIn('c.id', $ids); 

    die($q->getSqlQuery()); 
    $mans = $q->execute(); 
    return $mans; 
} 

당신이 날 실행됩니다 어떤 쿼리 정보를 제공 getManufacturersForCategoryDeep 내부 die 전화가 알다시피

.

SELECT `m`.`id` AS `m__id`, `m`.`name` AS `m__name`, COUNT(`p`.`manufacturer_id`) AS `p__0` FROM `manufacturer` `m` 
INNER JOIN `product` `p` ON `m`.`id` = `p`.`manufacturer_id` 
INNER JOIN `category` `c` ON `p`.`category_id` = `c`.`id` 
WHERE `m`.`id` IN ('49', '43', '127', '42', '65', '134', '113') 
AND (`p`.`is_published` = 1 
AND `p`.`is_available` = 1 
AND `c`.`id` IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)) 
GROUP BY `p`.`manufacturer_id` ORDER BY `p__0` DESC 

그리고 나는이 줄을 내가 DQL 쿼리 구문 분석 캐싱 APC와 memcached를 캐싱을 사용하는 쿼리 WHERE m.id IN ('49', '43', '127', '42', '65', '134', '113') 에 나타나는 이유를 잘 모릅니다 있지만 한 달 전에 비활성화되었습니다 : 여기에 SQL 쿼리입니다. 그러면이 쿼리로 어떤 일이 일어나는지 알 수 있습니까?

UPDATE : 당신이 DQL 교리에서 쿼리에 limit()를 추가 할 때 여기에 개방 버그 http://www.doctrine-project.org/jira/browse/DC-1052?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab

답변

1

입니다 실제로 별도의 두 가지에 검색어를 나누기 :이 라인은 제거 limit() 호출 후 사라져가

UPDATE2입니다 사람. 첫 번째 쿼리에서 사용 된 모든 조건 (LIMIT)을 사용하여 기본 키만 선택됩니다.

두 번째 쿼리는 첫 번째 쿼리에서 발견 된 기본 키 목록을 사용하여 실제 개체를 선택하여 결과를 제한합니다. 그래서 쿼리에서 추가 행을 볼 수 있습니다.

나는 이것이 성능상의 이유로 사용되었다고 생각합니다.

+0

doctrine은 두 개의 별도의 SQL 요청을한다는 의미입니까? 글쎄, 이상한 것보다 symfony 1.4 디버그 바는 당신이 언급 한 첫 번째 쿼리를 보여주지 못하기 때문에 – kirugan

+0

조심스럽게 살펴 보라.) (적어도 나는 디버그 바에서 찾을 수있다). 그것을 기록하지 않는 Sf 1.4.8이 아니라면 말이다. 최신 1.4.20 버전으로 이동하십시오. –

+0

내 버전은 1.4.10입니다. 답해 주셔서 감사합니다. – kirugan