0

タスク

関連するモデルの条件に基づいてデータのセットを返そうとしています。

問題

現在、私が取得できる最も近いものは、Containableを使用して一致するすべてのモデルデータを返すことですが、contain条件に一致する場合にのみ子データを返します。私のデータには、削除されるのではなく、プライマリモデルデータがまだ含まれているため、これは理想的ではありません。

たとえば、Productとの間でHABTM関係を使用しCategoryていて、特定のカテゴリのすべての製品を検索したいと考えています。

最初のアイデア

基本的な方法は、containableを使用することです。

$this->Product->find('all', array(
    'contain' => array(
        'Category' => array(
            'conditions' => array(
                'Category.id' => $categoryId
            )
        )
    )
));

ただし、これによりすべての商品が返され、contain条件に一致しない場合はCategoryディメンションが削除されます。

これまでで最も近い

$this->Product->find('all', array(
    'contain' => false,
    'joins' => array(
        array(
            'table' => 'categories_products',
            'alias' => 'CategoriesProduct',
            'type' => 'LEFT',
            'conditions' => array(
                'CategoriesProduct.product_id' => 'Product.id'
            )
        ),
        array(
            'table' => 'categories',
            'alias' => 'Category',
            'type' => 'LEFT',
            'conditions' => array(
                'Category.id' => 'CategoriesProduct.category_id'
            )
        )
    ),
    'conditions' => array(
        'Product.status_id' => 1,
        'Category.id' => $categoryId
    ),
));

次のクエリを生成します。

SELECT `Product`.`id`, `Product`.`name`, `Product`.`intro`, `Product`.`content`, `Product`.`price`, `Product`.`image`, `Product`.`image_dir`, `Product`.`icon`, `Product`.`icon_dir`, `Product`.`created`, `Product`.`modified`, `Product`.`status_id` 
FROM `skyapps`.`products` AS `Product` 
LEFT JOIN `skyapps`.`categories_products` AS `CategoriesProduct` ON (`CategoriesProduct`.`product_id` = 'Product.id') 
LEFT JOIN `skyapps`.`categories` AS `Category` ON (`Category`.`id` = 'CategoriesProduct.category_id') 
WHERE `Product`.`status_id` = 1 
AND `Category`.`id` = 12

このクエリは正しいですが、結合条件が `ではなく'で引用されているため、クエリが壊れます。

手動クエリ

SELECT * 
FROM products
JOIN categories_products ON categories_products.product_id = products.id
JOIN categories ON categories.id = categories_products.category_id
WHERE categories.id = 12
4

1 に答える 1