如何通过过滤子模型数据来删除父模型数据?

时间:2013-02-20 10:51:22

标签: cakephp cakephp-2.2

任务

我正在尝试根据相关模型中的条件返回一组数据。

问题

目前我最接近的是使用Containable返回所有匹配的模型数据,但只返回子数据(如果它与contains条件匹配)。这并不理想,因为我的数据仍包含主要模型数据,而不是被删除。

我正在使用HABTM关系,例如ProductCategory之间的关系,我希望找到特定类别中的所有产品。

初学者的想法

基本方法是使用可包含的。

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

虽然这会返回所有产品,但如果它与包含条件不匹配,则只删除它。

目前为止最近

$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

1 个答案:

答案 0 :(得分:1)

问题在于我定义连接条件的方式。它不是一个关联数组,而是一个字符串。

        'conditions' => array(
            'CategoriesProduct.product_id' => 'Product.id'
        )

的更改
        'conditions' => array(
            'CategoriesProduct.product_id = Product.id'
        )