CakePhp:模型递归关联和查找

时间:2010-05-28 13:40:26

标签: php cakephp model belongs-to

我对CakePhp上的模型上的find()有些麻烦。

我以这种方式关联了三个模型:

项目(some_fields,item_id) ------ -----属于关联>项目(some_fields,item_id) ------ -----属于关联>用户(some_fields campi,昵称)

我需要执行find()并检索项目中的所有字段,Item中的字段和User中的昵称字段。这是我的代码:

$this->set('projects', $this->Project->find('all', array('recursive' => 2)));

但我的输出不包含用户对象。 我尝试过Containable行为,但输出是一样的。什么坏了?

非常感谢

彼得

3 个答案:

答案 0 :(得分:1)

您的方法会生成太多查询。您可能希望通过绑定和取消绑定模型来减少其数量。详情请见here

答案 1 :(得分:1)

正确设置模型或尝试使用连接

$this->Project->recursive = -1;
$this->Project->find('all', array(
   'joins'=>array(
      array(
        'table'=>'item',
        'alias'=>'Item',
        'type'=>'INNER',
        'conditions'=>array(
           'Item.id=Project.item_id'
             )
          ),
       array(
         'table'=>'user',
         'alias'=>'User',
         'type'=>'INNER',
         'conditions'=>array(
            'User.id=Item.user_id'
         )
      )
   ),
   'fields'=>array(
     //necessary
   ),
   'conditions'=>array(
     //if any
   );

答案 2 :(得分:1)

Project.php模型文件应如下所示

<?php
App::uses('AppModel','Model');
/*
*
* Project Model
*
*/
Class Project extends AppModel{

/*
*
* actsAs Behaviour
*
*/
    public $actsAs = array('Containable');

/*
*
* belongsTO association
*
*/  
    public $belongsTo = array(
        'Item' => array(
            'className' => 'Item',
            'foreignKey' => 'project_id',
            )
        );
}
?>

Item.php模型文件应如下所示

<?php
App::uses('AppModel','Model');
/*
*
* Item Model
*
*/
Class Item extends AppModel{

/*
*
* actsAs Behaviour
*
*/
    public $actsAs = array('Containable');

/*
*
* belongsTO association
*
*/  
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'item_id',
            )
        );
/*
*
* hasMany association
*
*/  
    public $hasMany = array(
        'Project' => array(
            'className' => 'Project',
            'foreignKey' => 'project_id',
            )
        );  
}
?>

User.php模型文件应如下所示

<?php
App::uses('AppModel','Model');
/*
*
* User Model
*
*/
Class User extends AppModel{

/*
*
* actsAs Behaviour
*
*/
    public $actsAs = array('Containable');


/*
*
* hasMany association
*
*/  
    public $hasMany = array(
        'Item' => array(
            'className' => 'Item',
            'foreignKey' => 'item_id',
            )
        );  
}
?>

您可以尝试使用控制器中的以下代码。

<?php
$contain = array('Item' => array('User'));
$this->set('projects', $this->Project->find('all', array('contain' => $contain)));
?>