CakePHP Recursive не работает с loadModel и этим-> set

0

Рекурсия, похоже, не работает, когда я использую $this-> loadModel, я хочу сказать, что я помню что-то о том, что я должен явно установить атрибут ownTo и hasMany в этой ситуации, но это похоже на анти-cakephp-auto-magical, у меня еще нет найти ответы на вопрос о том, как использовать

$this->loadModel 

а также

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

любые идеи о том, почему это не работает, очень признательны.

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

$this->loadModel('DeployablesComplete');
$deployablesCompletes = $this->DeployablesComplete->find('all', array('recursive' => 2, 'conditions' => array('successful' => array('0', '-1'))));

$this->set('deployablesCompletes', $deployablesCompletes);
$this->set('deployablesJoins', $deployablesJoins);

Изменение: полный код ниже

Моя модель DeployablesJoin

class DeployablesJoin extends NodeCncAppModel {

    public $actsAs = array('Containable');

    public $belongsTo = array(
        'Deployable' => array(
            'className' => 'Deployable',
            'foreignKey' => 'deployable_id',
            'conditions' => '',
            'fields' => 'title,filename,created',
            'order' => ''
        ),
        'ServerClass' => array(
            'className' => 'ServerClass',
            'foreignKey' => 'server_class_id',
            'conditions' => '',
            'fields' => 'name',
            'order' => ''
        )
    );
}

Соответствующая часть контроллера

    $this->loadModel('DeployablesJoin');
    $deployablesJoins = $this->DeployablesJoin->find('all');

    print_r($deployablesJoins); die();

Результаты print_r/die

Array ( 
    [0] => Array ( 
        [DeployablesJoin] => Array ( 
            [id] => 1 
            [deployable_id] => 5 
            [server_class_id] => 1 
        ) 
    ) 
)

То, что я нашел, что работает, следующее (соответствующий контроллер детали)

$this->loadModel('DeployablesJoin');
$this->DeployablesJoin->belongsTo = array(
    'Deployable' => array(
        'className' => 'Deployable',
        'foreignKey' => 'deployable_id',
        'conditions' => '',
        'fields' => 'title,filename,created',
        'order' => ''
    ),
    'ServerClass' => array(
        'className' => 'ServerClass',
        'foreignKey' => 'server_class_id',
        'conditions' => '',
        'fields' => 'name',
        'order' => ''
    )
);
$deployablesJoins = $this->DeployablesJoin->find('all');

print_r($deployablesJoins); die();

Результаты print_r/die

Array ( 
    [0] => Array ( 
        [DeployablesJoin] => Array ( 
            [id] => 1 
            [deployable_id] => 5 
            [server_class_id] => 1 
        ) 
        [Deployable] => Array ( 
            [title] => asdf 
            [filename] => 5_agent.zip 
            [created] => 2015-01-09 21:31:25 
        ) 
       [ServerClass] => Array ( 
            [name] => Crawler 
       ) 
 )

Когда я делаю print_r/die на $this-> DeployablesJoin, я получаю следующее

AppModel Object
(
    [useDbConfig] => default
    [useTable] => deployables_joins
    [id] => 
    ...
    [table] => deployables_joins
    [primaryKey] => id
    ...
    [name] => DeployablesJoin
    [alias] => DeployablesJoin
    [tableToModel] => Array
        (
            [deployables_joins] => DeployablesJoin
        )

    [cacheQueries] => 
    [belongsTo] => Array
        (
        )
  • 0
    Я собираюсь заглянуть в ядро и посмотреть, что с этим принадлежит и почему он не загружает этот массив
  • 0
    Это наверняка проблема с принадлежит, см. Недавнее редактирование
Показать ещё 1 комментарий
Теги:
cakephp
recursion
cakephp-model

2 ответа

1
Лучший ответ

Кажется, нет никаких причин, по которым ваша "рекурсивная" не будет работать, кроме ассоциаций, установленных неправильно. Я бы предложил проверить их.

При этом использование рекурсивного 2 считается плохой практикой. Вместо этого установите -1 на -1 и используйте CakePHP amazing Containable Behavior для получения любой дополнительной информации.

Другим изменением "лучшей практики" было бы превратить ваши находки в методы модели, а не в контроллеры. Итак, в вашем случае это будет примерно так:

// in the controller
$this->loadModel('DeployablesJoin');
$deployablesJoins =  $this->DeployableJoin->getAll();

//in the DeployablesJoin model
public function getAll() {
    $this->recursive = 2; // should change this to containable instead though
    return $this->find('all');
}
  • 0
    Я получаю синтаксическую ошибку или нарушение прав доступа: 1064 В вашем синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'getAll' в строке 1
  • 0
    Я думаю, что это довольно близко, но без сигары
Показать ещё 2 комментария
1

Проблема в том, что модель, которую я пытаюсь загрузить, находится в плагине, и я не указал плагин в loadModel, как...

$this->loadModel('NodeCnc.DeployablesJoin');

Я бы поймал это раньше, однако, со следующим, он все еще возвращал результаты

$this->loadModel('DeployablesJoin');

Я собираюсь представить два патча, один для загрузки модели без части плагина, а другой - для выброса ошибки при загрузке без плагина и просмотра того, что получает.

  • 1
    Меня просто поймала эта простая ошибка, спасибо за проверку вменяемости, Джеффри!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню