Уже поздно, и я написал это чудовище запроса, чтобы получить связанные продукты на основе продукта, который я уже нашел.
Мне нужно выбрать продукты той же категории (HABTM), родительский продуктпродукты с одним и тем же родителем (братья и сестры / соседи) и продукты, которые являются прямыми дочерними элементами текущего продукта (существует только один уровень вложенности).У меня есть идентификатор продукта и его 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
));
}