【发布时间】:2012-01-11 23:15:46
【问题描述】:
已经很晚了,我已经写了这个怪异的查询来根据我已经找到的产品获取相关产品。
我需要获取同一类别(HABTM)中的产品、父产品、具有相同父产品(兄弟/邻居)的产品以及当前产品的直接子产品(只有一层嵌套)。我有当前产品的产品 ID 及其 parent_id。如果可以在产品上设置Product.published = 1 的条件,那就太好了,但如果它会使查询变得如此之大,我总是可以在之后检查。另外,我需要排除当前产品。
SELECT `products`.*
FROM `products`, `categories_products`
WHERE
(
(
`categories_products`.`product_id` = `products`.`id`
AND `categories_products`.`category_id` IN (
SELECT `category_id`
FROM `categories_products`
WHERE `categories_products`.`product_id` = '$product_id'
)
)
OR `products`.`parent_id` = '$parent_id'
OR `products`.`parent_id` = '$product_id'
OR `products`.`id` = '$parent_id'
)
AND `product`.`id` <> '$product_id'
GROUP BY `products`.`id`
甚至可以进一步优化它,到目前为止我有:
public function related($productData, $limit = 4) {
$conditions = array(
'OR' => array(array('Product.parent_id' => $productData['Product']['id'])), // Children of product),
'Product.id <>' => $productData['Product']['id']
);
if(!empty($product['parent_id'])) {
$conditions['OR'][] = array('Product.parent_id' => $productData['Product']['parent_id']); // Siblings
$conditions['OR'][] = array('Product.id' => $productData['Product']['parent_id']); // Parent of product
}
return $this->find('all', array(
'conditions' => $conditions,
'contain' => array('Category'),
'group' => 'Product.id',
'limit' => $limit
));
}
【问题讨论】:
-
可怕吗?这似乎只是一个正常的选择......营销+1
-
@Márcio 关于这个玩笑:)
-
为了简单起见,我希望这些变量嵌入到查询中?
-
您必须查看手册的“复杂查找查询”部分,了解如何形成子查询。不过老实说,经过一段时间后,通过 Cake DAL 是不值得的,您应该简单地精心制作自己的 SQL 并使用
Model::query。
标签: mysql cakephp join has-and-belongs-to-many