CakePHP:加入操作不起作用

时间:2014-05-18 08:53:14

标签: php mysql sql cakephp join

我有桌子

Items, Attributes,Taxonomies, Taxonomy_attributes,Item_attributes.

Taxonomy_attributes有两个字段attribute_id(属性表id的外键)和taxonomy_id(分类表id的外键)。 另一方面,Item_attributes有两个字段attribute_id(id属性表的外键)和item_id(id项表的外键)。 属性表具有以下字段: - 名称,类型和可检查(为0或1)。 Items表有字段id和model。 分类表包含字段if和name。

我想在属性模型中添加一个方法,该方法返回所有属性的列表,其中checkable等于1并与项目和分类法连接,返回项目模型&每个属性的分类名称。

我的代码如下: -

public function getCheckables($checkable)
{
    $data =  $this->find('all',array(
                'fields' => array('Attribute.name', 'Attribute.type', 'Item.model', 'Taxonomy.name'),
                'conditions' => array('Attribute.checkable' => 1),
                'joins' =>  array(
                            array(
                                 'table' => 'item_attributes',
                                'alias' => 'ItemAttribute',
                                'type' => 'INNER',
                                'conditions' => 'ItemAttribute.Item_id = Item.id',
                             ),
                             array( 
                                'table' => 'items',
                                'alias' => 'Item',
                                'type' => 'INNER',
                                'conditions' => 'ItemAttribute.item_id = Item.id'
                            ),
                             array( 
                                'table' => 'taxonomy_attributes',
                                'alias' => 'TaxonomyAttribute',
                                'type' => 'INNER',
                                'conditions' => 'TaxonomyAttribute.Taxonomy_id = Taxonomy.id'
                            )

                    ),
                    'recursive'=>-1
                )
                );  
                pr($data); die();   
}

任何人都能用正确的代码指导我吗?

2 个答案:

答案 0 :(得分:1)

您的两个联接具有相同的条件:'conditions'=> 'ItemAttribute.Item_id = Item.id',如果是第一个,则Item表尚未加入,如果是第二个,因为您的第一个条件错误,ItemAttribute表未加入。

答案 1 :(得分:0)

实际解决方案

public function getCheckables($checkable)
    {
        $data =  $this->find('all',array(
                    'fields' => array('Attribute.name', 'Attribute.type', 'Item.model', 'Taxonomy.name'),
                    'conditions' => array('Attribute.checkable' => 1),
                    'joins' =>  array(

                                 array(
                                     'table' => 'item_attributes',
                                    'alias' => 'ItemAttribute',
                                    'type' => 'INNER',
                                    'conditions' => 'ItemAttribute.attribute_id = Attribute.id',
                                 ),
                                 array( 
                                    'table' => 'items',
                                    'alias' => 'Item',
                                    'type' => 'INNER',
                                    'conditions' => 'ItemAttribute.item_id = Item.id'
                                ),
                                  array( 
                                    'table' => 'taxonomies',
                                    'alias' => 'Taxonomy',
                                    'type' => 'LEFT',
                                    'conditions' => 'Item.category_id = Item.id'
                                )



                        ),
                        'recursive'=>-1
                    )
                    );  
                    pr($data); die();   
    }