蛋糕2.5.1将2个模型绑在一起

时间:2014-07-08 08:45:27

标签: cakephp

我有一个模型排名,其中包含contact_id和belongsTo Model Contact。 Model Contact有一个costumer_id和belongsTo Model Costumer。 并且有很多排名。

还有一个模型产品,有很多排名。

在统计页面上,我选择

$this->Product->recursive = 1;
$this->set('products', $this->Paginator->paginate())

我得到了

的数组
array(
    'Product' => array(
        'id' => '69',
    ),
    'Ranking' => array(
        (int) 0 => array(
            'id' => '29',
            'contact_id' => '9',
            'product_id' => '69',
            'ranking' => '9',
        ),

我想现在将Contact和Costumer绑定到基于contact_id的排名。 这可以通过bindModel手动完成吗? 如果是,我该怎么做?

我尝试设置$ this-> Product-> recursive = 1;到2和3,但选择了许多其他东西,我需要用unbindModel来清除...所以我希望有一种更聪明的方法来绑定那些模型来获取数据......?

2 个答案:

答案 0 :(得分:0)

您基本上想要使用的是containable behavior。通过此行为,您可以筛选和限制模型查找操作。您可以在模型级别或控制器上添加此行为,以避免在应用程序已经增长到复杂级别时产生副作用。

来自Cake-Book的示例:

// Activate Containable Behavior on the fly in a controller
$this->User->Behaviors->load('Containable');
$this->User->contain();

$this->User->find('all', array(
    'contain' => array(
        'Profile',
        'Account' => array(
            'AccountSummary'
        ),
        'Post' => array(
            'PostAttachment' => array(
                'fields' => array('id', 'name'),
                'PostAttachmentHistory' => array(
                    'HistoryNotes' => array(
                        'fields' => array('id', 'note')
                    )
                )
            ),
            'Tag' => array(
                'conditions' => array('Tag.name LIKE' => '%happy%')
            )
        )
    )
));

希望这能让你朝着正确的方向前进。

答案 1 :(得分:0)

使用find它会得到我正确的数据:

$this->set('products', $this->Product->find('all', array(
            'contain' => array(
                'Ranking' => array(
                    'Contact' => array(
                        'foreignKey' => 'contact_id',
                        'Customer' => array(
                            'foreignKey' => 'customer_id',
                        )
                    )
                )
            )
        )));

使用Paginator时,它看起来像

$this->Paginator->settings['contain'] = array(
                'Ranking' => array(
                    'Contact' => array(
                        'foreignKey' => 'contact_id',
                        'Customer' => array(
                            'foreignKey' => 'customer_id',
                        )
                    )
                )
           );

$this->Product->Behaviors->load('Containable');
        $this->set('products', $this->Paginator->paginate());

非常感谢!!