CakePHP访问第二级关联数据

时间:2013-03-11 21:31:38

标签: cakephp associations

我拥有属于类别交易,并且可以拥有一个 Fuelup Fuelup 属于汽车交易

class Transaction extends AppModel {
    public $belongsTo = array('Category');
    public $hasOne = array('Fuelup');
}

class Fuelup extends AppModel {
    public $belongsTo = array('Transaction','Car');
}

class Car extends AppModel {
        public $hasMany = array('FuelUp');
}

class Category extends AppModel {
    public $hasMany = "Transaction";
}

我的表格如下:

transactions id|category_id|description
categories   id|name
cars         id|name|numberplate
fuelups      transaction_id|car_id|amount|mileage

在交易的index-function中,我想索引所有交易,并且如果存在的话,还要显示Fuelup:

public function index() {
     $this->set('transactions', $this->Transaction->find('all'));
}

如何在此视图中访问汽车的名称?我可以毫无问题地使用$ transaction ['Fuelup'] ['car_id'],但无法访问$ transaction ['Fuelup'] ['Car']等。

我正在运行最新版本的CakePHP 2.3.1。

2 个答案:

答案 0 :(得分:3)

您应该查看Containable行为,而不是使用Hugo指定的递归。您可以将其附加到AppModel中,如此:

class AppModel extends Model {
    public $recursive = -1; // disable recursive

    public $actsAs = array('Containable');
}

然后当你找到你的发现时,你可以这样做:

class AppModel extends Model {
    $transactions = $this->Transaction->find('all', array(
        'contain' => array(
            'Fuelup' => array(
                'Car'
            )
        )
    ));
    $this->set('transactions', $transactions);
}

Containable效率更高,因为它只会抓取你指定的数据,而递归会带回你不需要的数据,浪费资源。

答案 1 :(得分:2)

您必须设置递归级别。你可以这样做:

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

递归属性定义了CakePHP应该通过find()和read()方法获取关联模型数据的深度。

请参阅Cook Book中的this entry