2

我在 symfony 1.4.8 中使用学说 1.2。这是我的代码:

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;
}

正如您可能注意到的那样,die里面有一个调用,getManufacturersForCategoryDeep它为我提供了将执行哪些查询的信息。这是sql查询:

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

而且我不知道为什么这条线出现在查询中WHERE m.id IN ('49', '43', '127', '42', '65', '134', '113') 我使用 apc 和 memcached 缓存进行 DQL 查询解析缓存,但是一个月前它被禁用了。那么我怎样才能找出这个查询发生了什么?

更新:此行在删除limit()调用后消失

UPDATE2:这里是开放的错误http://www.doctrine-project.org/jira/browse/DC-1052?page=com.atlassian.streams.streams-jira-plugin:activity-stream-issue-tab

4

1 回答 1

1

当您limit()在 DQL Doctrine 中添加查询时,实际上会将您的查询分成两个单独的查询。在第一个查询中,仅使用您使用的所有条件(也是LIMIT)选择主键。

第二个查询使用在第一个查询中找到的主键列表来选择实际对象以限制结果。这就是您可以在查询中看到附加行的原因。

我相信这是出于性能原因而使用的。

于 2013-06-17T13:01:24.683 回答