1

カテゴリに属する​​トランザクションがあり、1 つのFuelupを持つことができます。FuelupはCarTransaction に属します。

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

トランザクションのインデックス関数で、すべてのトランザクションのインデックスを作成し、存在する場合は Fuelup も表示します。

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

このビューで車の名前にアクセスするにはどうすればよいですか? $transaction['Fuelup']['car_id'] は問題なく使えますが、$transaction['Fuelup']['Car'] などにアクセスできません。

CakePHP 2.3.1 の最新バージョンを実行しています。

4

2 に答える 2

3

Hugo で指定されているように再帰を使用するのではなく、Containableの動作を調べる必要があります。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 は指定したデータのみを取得するため、はるかに効率的ですが、recursive は必要のないデータを返し、リソースを浪費します。

于 2013-03-11T21:57:35.477 に答える
2

You have to set the level of recursivity. You can do :

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

The recursive property defines how deep CakePHP should go to fetch associated model data via find(), and read() methods.

See this entry from the Cook Book.

于 2013-03-11T21:36:30.227 に答える