Нумерация страниц с рекурсией при использовании loadModel - PullRequest
1 голос
/ 19 марта 2011

В моем контроллере «Отчеты», который является просто фиктивным контроллером без какой-либо реальной базы данных, я пытаюсь создать постраничное представление других моделей. Например, чтобы сгенерировать постраничное представление модели «Транзакции», я делаю следующее:

$this->loadModel('Transactions');
$this->Transactions->bindModel(array('belongsTo'=>array('Item'=>array('className'=>'Item'),'Member'=>array('className'=>'Member'))));
$results = $this->paginate('Transactions',null,array('recursive'=>1));

Но это не дает мне связанных данных от Предметов и Участников. Если я сделаю

$this->Transactions->find('all',array('recursive'=>1))

Я получаю связанные данные, но не разбит на страницы. Как я получу постраничное представление, которое также включает связанные данные?

1 Ответ

2 голосов
/ 19 марта 2011

Две вещи: во-первых, даже когда множественные имена моделей могут работать по какой-то странной причине, существует соглашение, что имена моделей являются единичными, как $this->loadModel('Transaction');. См. руководство по соглашениям об именах .

Во-вторых, забудьте о recursive и продолжайте поведение Containable. Честно говоря, это настолько полезно, что мне интересно, почему это не процесс по умолчанию (возможно, потому что Containable был создан, когда среда была очень зрелой). У Мэтта есть хорошая книга , объясняющая, почему Containable хорош (загрузите его, действительно, это почти обязательно: D). Но, чтобы помочь еще больше, я расскажу вам, как именно вы решаете свою проблему с помощьюableable:

1) Определите ассоциации в моделях, например:

В модели транзакции:

var $belongsTo = array(
    'Item' => array(
        'className' => 'Item',
        'foreignKey' => 'item_id',
    )
);

В модели изделия:

var $hasMany = array(
    'Transaction' => array(
        'className' => 'Transaction',
        'foreignKey' => 'item_id',
        'dependent' => true,
        'exclusive' => true,
    )
);

Сделайте то же самое для модели Member.

2) Создайте файл app_model.php в /app/ с этим кодом: (Переменная $actsAs здесь в классе AppModel указывает всем моделям использовать Containable)

<?php
class AppModel extends Model {
    var $recursive = -1;
    var $actsAs = array('Containable');
}
?>

3) В контроллере отчетов измените код на что-то вроде этого: (Параметр contains - это массив всех связанных моделей, которые вы хотите включить. Вы можете включить только одну ассоциированную модель, или все, или что вы хотите).

$this->loadModel('Transaction');
$this->paginate = array('Transaction' => array('contain' => array('Item', 'Member')));      
$results = $this->paginate('Transaction');

И это все!

...