CakePHP 查找分组依据不在生成的查询中
CakePHP find group by isn't in the generated query
我们有一个相当全面的发现,请参阅下面的代码,并按部分分组。由于某种原因,组部分不起作用,它甚至不在生成的查询中。因此,我们在查找中得到了双重结果(为什么我们首先要使用 group by 函数)。
$this->Product->Behaviors->load('Containable');
$this->paginate = array(
'contain' => array(
'Reduction' => array(
'fields' => array(
'Reduction.id', 'Reduction.startdate', 'Reduction.enddate', 'Reduction.price'
),
'conditions' => array(
'Reduction.startdate <' => date('Y-m-d H:00:00'),
'Reduction.enddate >' => date('Y-m-d H:00:00'),
),
),
'Mediafile',
'Deliverytime' => array(
'fields' => array(
'Deliverytime.id', 'Deliverytime.name'
)
)
),
'fields' => array(
'Product.id', 'Product.name', 'Product.slug', 'Product.price', 'Product.content_short', 'Product.metadescription', 'Product.name_short',
'Category.id', 'Category.name', 'Category.slug',
),
'conditions' => array(
'Product.status' => 'active',
'Product.visibility' => 1,
'Product.hidden_on_site' => 0,
'OR' => array(
array(
'AND' => array(
array('Product.use_stock_count' => 0)
)
),
array(
'AND' => array(
array('Product.use_stock_count' => 1),
array('Product.stock_count >=' => 1)
)
),
),
),
'joins' => array(
array(
'table' => 'products_categories',
'alias' => 'ProductsCategory',
'type' => 'INNER',
'conditions' => array(
'ProductsCategory.category_id' => $cat_ids,
'ProductsCategory.product_id = Product.id',
)
),
array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'INNER',
'conditions' => array(
'Category.id = ProductsCategory.category_id',
)
),
),
'order' => 'Product.price ASC',
'group' => 'Product.id',
'limit' => $limit,
'recursive' => -1,
'page' => $page_number,
);
$products = $this->paginate('Product');
这是生成的查询:
SELECT `Product`.`id`, `Product`.`name`, `Product`.`slug`, `Product`.`price`, `Product`.`content_short`, `Product`.`metadescription`, `Product`.`name_short`, `Category`.`id`, `Category`.`name`, `Category`.`slug`, `Deliverytime`.`id`, `Deliverytime`.`name`, `Product`.`id`
FROM `products` AS `Product`
LEFT JOIN `deliverytimes` AS `Deliverytime` ON (`Product`.`deliverytime_id` = `Deliverytime`.`id`)
INNER JOIN `products_categories` AS `ProductsCategory` ON (`ProductsCategory`.`category_id` IN ('15', '306', '308', '309', '26', '167', '248', '185', '115', '116', '23', '258', '201', '22', '16', '17', '25', '19', '18', '114', '27', '127', '158', '136') AND `ProductsCategory`.`product_id` = `Product`.`id`)
INNER JOIN `categories` AS `Category` ON (`Category`.`id` = `ProductsCategory`.`category_id`)
WHERE `Product`.`status` = 'active' AND `Product`.`visibility` = '1' AND `Product`.`hidden_on_site` = '0' AND ((`Product`.`use_stock_count` = '0') OR (((`Product`.`use_stock_count` = '1') AND (`Product`.`stock_count` >= 1))))
ORDER BY `Product`.`price` ASC
LIMIT 18
如您所见,没有GROUP BY
。我们还尝试在 Product.id
上使用 DISTINCT
,但这也不起作用。如果您 运行 查询并自己在 GROUP BY
部分,我们会得到结果 我们 want.We 也尝试将 group
部分放在数组中,例如 'group' => array('Product.id')
, 但运气不好。
那么为什么我们的发现忽略了我们的 group
部分?我们怎样才能让它不被忽视?
原来是我们自己的错。我们团队中的某个人制作了一个自定义分页函数,该函数没有传递组变量。我当时并没有意识到这一点。当我在另一个项目中使用他的功能时,我有一个 "i get it now" 的时刻。
我们有一个相当全面的发现,请参阅下面的代码,并按部分分组。由于某种原因,组部分不起作用,它甚至不在生成的查询中。因此,我们在查找中得到了双重结果(为什么我们首先要使用 group by 函数)。
$this->Product->Behaviors->load('Containable');
$this->paginate = array(
'contain' => array(
'Reduction' => array(
'fields' => array(
'Reduction.id', 'Reduction.startdate', 'Reduction.enddate', 'Reduction.price'
),
'conditions' => array(
'Reduction.startdate <' => date('Y-m-d H:00:00'),
'Reduction.enddate >' => date('Y-m-d H:00:00'),
),
),
'Mediafile',
'Deliverytime' => array(
'fields' => array(
'Deliverytime.id', 'Deliverytime.name'
)
)
),
'fields' => array(
'Product.id', 'Product.name', 'Product.slug', 'Product.price', 'Product.content_short', 'Product.metadescription', 'Product.name_short',
'Category.id', 'Category.name', 'Category.slug',
),
'conditions' => array(
'Product.status' => 'active',
'Product.visibility' => 1,
'Product.hidden_on_site' => 0,
'OR' => array(
array(
'AND' => array(
array('Product.use_stock_count' => 0)
)
),
array(
'AND' => array(
array('Product.use_stock_count' => 1),
array('Product.stock_count >=' => 1)
)
),
),
),
'joins' => array(
array(
'table' => 'products_categories',
'alias' => 'ProductsCategory',
'type' => 'INNER',
'conditions' => array(
'ProductsCategory.category_id' => $cat_ids,
'ProductsCategory.product_id = Product.id',
)
),
array(
'table' => 'categories',
'alias' => 'Category',
'type' => 'INNER',
'conditions' => array(
'Category.id = ProductsCategory.category_id',
)
),
),
'order' => 'Product.price ASC',
'group' => 'Product.id',
'limit' => $limit,
'recursive' => -1,
'page' => $page_number,
);
$products = $this->paginate('Product');
这是生成的查询:
SELECT `Product`.`id`, `Product`.`name`, `Product`.`slug`, `Product`.`price`, `Product`.`content_short`, `Product`.`metadescription`, `Product`.`name_short`, `Category`.`id`, `Category`.`name`, `Category`.`slug`, `Deliverytime`.`id`, `Deliverytime`.`name`, `Product`.`id`
FROM `products` AS `Product`
LEFT JOIN `deliverytimes` AS `Deliverytime` ON (`Product`.`deliverytime_id` = `Deliverytime`.`id`)
INNER JOIN `products_categories` AS `ProductsCategory` ON (`ProductsCategory`.`category_id` IN ('15', '306', '308', '309', '26', '167', '248', '185', '115', '116', '23', '258', '201', '22', '16', '17', '25', '19', '18', '114', '27', '127', '158', '136') AND `ProductsCategory`.`product_id` = `Product`.`id`)
INNER JOIN `categories` AS `Category` ON (`Category`.`id` = `ProductsCategory`.`category_id`)
WHERE `Product`.`status` = 'active' AND `Product`.`visibility` = '1' AND `Product`.`hidden_on_site` = '0' AND ((`Product`.`use_stock_count` = '0') OR (((`Product`.`use_stock_count` = '1') AND (`Product`.`stock_count` >= 1))))
ORDER BY `Product`.`price` ASC
LIMIT 18
如您所见,没有GROUP BY
。我们还尝试在 Product.id
上使用 DISTINCT
,但这也不起作用。如果您 运行 查询并自己在 GROUP BY
部分,我们会得到结果 我们 want.We 也尝试将 group
部分放在数组中,例如 'group' => array('Product.id')
, 但运气不好。
那么为什么我们的发现忽略了我们的 group
部分?我们怎样才能让它不被忽视?
原来是我们自己的错。我们团队中的某个人制作了一个自定义分页函数,该函数没有传递组变量。我当时并没有意识到这一点。当我在另一个项目中使用他的功能时,我有一个 "i get it now" 的时刻。