我拥有属于类别的交易,并且可以拥有一个 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。
答案 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。