模型之间的深层联系

时间:2013-12-24 21:53:57

标签: php cakephp cakephp-2.0

大家好,我是cakephp的新手 现在我面临一个小问题 这是情况

我有一家商店,其中有许多产品与许多产品相关,每个产品都有一个类别 我想通过购买商店来取得所有这些  我不知道该怎么做 尝试使用hasMAny只给我ids

相反有没有办法让商店里面的商品目录每个目录都有产品的数组,其中有一个类别的数组 谢谢

enter image description here

2 个答案:

答案 0 :(得分:0)

好的,我现在在电脑上:)。

在ShopModel中:

class ShopModel extends AppModel {

    public $hasMany = array(
        'Catalog' => array(
            // binding params here...
        ),
    );

}

在CatalogModel中:

class CatalogModel extends AppModel {

    public $hasMany = array(
        'Product' => array(
            // binding params...
        ),
    ),

}

......这继续......

如果您不想在所有操作中获取过多数据,则应在AppModel中设置:

class AppModel extends Model {

    public $recursive = -1;

}

在您使用关联调用find函数的控制器操作中:

$this->Shop->Behaviors->load('Containable');
$big_array = $this->Shop->find('all', array(
    'conditions' => array(
        //...
    ),
    'contain' => array(
        'Catalog' => array(
            'Product' => array(
                // etc, you get the point :)
            ),
        ),
    ),
));

声明$ belongsTo关联也很好,所以你可以从任何地方访问任何东西,如下所示:

$this->Catalog->Behaviors->load('Containable');
$big_array = $this->Catalog->find('all', array(
    'conditions' => array(
        //...
    ),
    'contain' => array(
        'Product' => array(
            // ...
        ),
        'Shop' => array(
            // ...
        ),
    ),
));

修改

我看到你有一个Product->类别关系,我想用$ belongsTo来定义。如果您执行上述查询,您将获得大量重复查询(许多产品中的相同类别)。您可以使用$this->Category->find('list'),但我经常发现这不合适,因为它只返回一个字段(如果有人知道如何获得更多字段列表类型,我将不胜感激)。为此,我的解决方法是在Category模型中创建一个自定义函数,如下所示:

class Category extends AppModel {

    public function getSorted ($options = array()) {
        $temp= $this->find('all', $options);
        $output = array();
        foreach ($temp[$this->alias] as $row) {
            $output[$this->alias][$row['id']] = $row;
        }
        unset($temp);
        return $output;
    }

}

然后在控制器中我会声明两个数组,没有类别关联的大数组和类别列表一个:

$this->loadModel('Category');
$this->set('categories', $this->Category->getSorted());

这样,我可以在视图中的任何需要的地方按类别ID获取所需的类别。

答案 1 :(得分:-1)

不要使用CakePHP关联他们不善于处理复杂的关系,你以后会遇到问题....而是动态创建所有的连接查询...我给你举一个例子:

在Shop模型中创建一个函数并加入目录和产品,如下所示:

$options = array(
        'conditions' => array('Product.id'=>9),
        'joins' => array(
            array(
                'alias' => 'Catalog',  
                'table' => 'catalogs',
                'type' => 'LEFT',
                'conditions' => array(
                    'Catalog.product_id = Product.id',
                ),
            ),
            array(
                'alias' => 'Product',  
                'table' => 'products',
                'type' => 'LEFT',
                'conditions' => array(
                    'Shop.id = Product.shop_id',
                ),
            )
        ),
        'fields' => array('Product.*'),
        'group' => array('Product.id')
    );

 $returnData = $this->find('all',$options);

这将使编码变得更容易,您可以逃避关联!