cakephp为每个结果从同一个表中提取多个记录

时间:2012-01-31 00:41:44

标签: cakephp-2.0 cakephp-appmodel

好的,这有点复杂(反正对我来说)。我想从两个记录中提取图像以放入一个结果的视图中。

我有Unit,属于Complex。每个单元和每个复合体都可以在图像表中有记录。

我想让我的特定单位的结果显示图像表中单位的所有图像,以及其复合体中的一些图像(也存储在图像表中)。这是我的模特:

class Image extends AppModel {
    public $name='Image';
    var $belongsTo=array(
    'Unit'=>array (
        'className'=>'Unit',
        'foreignKey'=>'unit_id'
        ),
    'Complex'=>array (
        'className'=>'Complex',
        'foreignKey'=>'complex_id'
        ),
    'Restaurant'=>array (
        'className'=>'Restaurant',
        'foreignKey'=>'restaurant_id'
        )
    );


}

class Complex extends AppModel {
    public $name='Complex';
    public $hasMany=array('Unit');
    public $hasOne=array('Image');
    public $belongsTo=array(
        'Location'=>array(
            'className'=>'Location',
            'foreignKey'=>'location_id'
            )
    );






}

class Unit extends AppModel {
public $name='Unit';

public $belongsTo=array(
'User'=>array(
    'className'=>'User',
    'foreignKey'=>'user'
),
'Complex'=>array(
    'className'=>'Complex',
    'foreignKey'=>'complex_id'
),

'Location'=>array (
        'className'=>'Location',
        'foreignKey'=>'location_id'
        ),
);

public $hasOne=array('Image');

}

这是我的控制器逻辑:

$this->paginate['Unit']=array(
        'limit'=>9,
        'order' => 'RAND()',
        'contain'=>array(
                'User'=>array('email'),
                'Complex'=>array('location_id'),
                'Location',
                'Image'
                ),
        'conditions'=>array(

                'Unit.active'=>1)   
    );
$data = $this->paginate('Unit');
$this->set('allaccommodations', $data);

您可以看到调试here:的结果。它为单元提取我的图像数据,但是我需要它来拉出一个包含unit_id和complex_id的Image数组。这可能吗?

1 个答案:

答案 0 :(得分:2)

在这些情况下,您必须为Image模型使用不同的别名,因为关联数组不能容纳具有相同键的两个值。

class Complex extends AppModel {
    //...
    public $hasOne=array(
        'ComplexImage' => array(
            'className'=>'Image',
            'foreignKey'=>'complex_id'
        )
    );
}

class Unit extends AppModel {
    //...
    public $hasOne=array(
        'UnitImage' => array(
            'className'=>'Image',
            'foreignKey'=>'unit_id'
        )
    );
}

然后您的查询数组将更改为:

$this->paginate['Unit'] = array(
    'limit' => 9,
    'order' => 'RAND()',
    'contain' => array(
        'User' => array('email'),
        'Complex' => array(
            'fields' => array('id', 'location_id'),
            'ComplexImage'
        ),
        'Location',
        'UnitImage'
    ),
    'conditions' => array(
        'Unit.active' => 1)
);

这也会影响您访问模型的方式。

$this->Unit->UnitImage->id;