CakePhp: смоделируйте рекурсивные ассоциации и найдите - PullRequest
0 голосов
/ 28 мая 2010

У меня проблемы с функцией find () для модели на CakePhp.

У меня есть три модели, связанные таким образом:

Project (some_fields, item_id) ------ ownTo -----> Item (some_fields, item_id) ------ ownTo -----> User (some_fields campi, псевдоним)

Мне нужно сделать find () и извлечь все поля из проекта, поле из Item и поле псевдонима из User. Это мой код:

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

но мой вывод не содержит объект пользователя. Я пытался с контейнерным поведением, но вывод тот же. Что сломано?

Большое спасибо

Peter

Ответы [ 3 ]

1 голос
/ 30 мая 2014

Установите вашу модель правильно или попробуйте с помощью join

$this->Project->recursive = -1;
$this->Project->find('all', array(
   'joins'=>array(
      array(
        'table'=>'item',
        'alias'=>'Item',
        'type'=>'INNER',
        'conditions'=>array(
           'Item.id=Project.item_id'
             )
          ),
       array(
         'table'=>'user',
         'alias'=>'User',
         'type'=>'INNER',
         'conditions'=>array(
            'User.id=Item.user_id'
         )
      )
   ),
   'fields'=>array(
     //necessary
   ),
   'conditions'=>array(
     //if any
   );
1 голос
/ 04 июня 2014

Файл модели Project.php должен иметь следующий вид

<?php
App::uses('AppModel','Model');
/*
*
* Project Model
*
*/
Class Project extends AppModel{

/*
*
* actsAs Behaviour
*
*/
    public $actsAs = array('Containable');

/*
*
* belongsTO association
*
*/  
    public $belongsTo = array(
        'Item' => array(
            'className' => 'Item',
            'foreignKey' => 'project_id',
            )
        );
}
?>

Файл модели Item.php должен быть таким, как показано ниже

<?php
App::uses('AppModel','Model');
/*
*
* Item Model
*
*/
Class Item extends AppModel{

/*
*
* actsAs Behaviour
*
*/
    public $actsAs = array('Containable');

/*
*
* belongsTO association
*
*/  
    public $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'item_id',
            )
        );
/*
*
* hasMany association
*
*/  
    public $hasMany = array(
        'Project' => array(
            'className' => 'Project',
            'foreignKey' => 'project_id',
            )
        );  
}
?>

Файл модели User.php должен быть таким, как показано ниже

<?php
App::uses('AppModel','Model');
/*
*
* User Model
*
*/
Class User extends AppModel{

/*
*
* actsAs Behaviour
*
*/
    public $actsAs = array('Containable');


/*
*
* hasMany association
*
*/  
    public $hasMany = array(
        'Item' => array(
            'className' => 'Item',
            'foreignKey' => 'item_id',
            )
        );  
}
?>

Вы можете попробовать с приведенным ниже кодом в контроллере.

<?php
$contain = array('Item' => array('User'));
$this->set('projects', $this->Project->find('all', array('contain' => $contain)));
?>
1 голос
/ 28 мая 2010

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

...