2013-04-17 3 views
0

В моем контроллере я хочу установить переменную (A), которая имеет отношение один к другому с другой моделью (B), которая имеет отношение HABTM (имеет и принадлежит многим) с моделью ANOTHER (C).CakePHP: Как установить переменные с многоуровневой зависимостью

В настоящее время, когда я установить переменную в контроллере я могу получить доступ к модели (B) в представлении, но не его зависимостями (модель C):

//A's controller... 
public function admin_view($id = NULL) { 
    $A = $this->A->findById($id);  
    $this->set('A', $A); 
} 

Вот что я вижу, если я сбросить переменную на вид:

//A's admin_view.ctp... 
//debug($A); 

array(
'A' => array(
    'id' => '1', 
    'name' => 'Name', 
    'created' => '2013-04-04 15:25:54', 
    'modified' => '2013-04-04 15:25:54' 
), 
'B' => array(
    (int) 0 => array(
     'id' => '1', 
     'created' => '0000-00-00 00:00:00', 
     'modified' => '2013-04-05 10:31:42' 
    ), 
    (int) 1 => array(
     'id' => '13', 
     'created' => '0000-00-00 00:00:00', 
     'modified' => '2013-04-05 10:31:42' 

Есть ли способ установить переменную, для которой каждый «B» будет иметь соответствующие Cs?

+1

Какова ваша величина '$ рекурсивная'? Установлено ли оно равным 2 или ниже? – Nunser

+0

Хороший вопрос !! Я не знаю, что это такое, но это похоже на то, почему он не работает так, как я хочу. – emersonthis

+0

Бум. Это было так: http://book.cakephp.org/2.0/en/models/model-attributes.html#recursive – emersonthis

ответ

1

http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

// In your model 
var $actsAs = array('Containable'); 

// In your controller 
public function admin_view($id = NULL) { 
    $this->A->contain(array('B' => array('C'))); 
    $A = $this->A->findById($id);  
    $this->set('A', $A); 
} 

Это должно дать вам то, что вам нужно, настройки рекурсивной до 2 является простым способом, но вы получите избыточные данные, если у вас есть другие ассоциации.

+0

Можете ли вы прояснить часть избыточных данных? – emersonthis

+1

Ну, допустим, 'A hasMany D', вы хотите вытащить D каждый раз, когда вы просто разбираете A, B и C? Просто говоря, если у вас есть другие ассоциации, они тоже будут втянуты, сдерживаемые позволят вам выборочно выбирать, к каким детским моделям тянуть. –

+0

Получил. Имеет смысл. – emersonthis

1

Ну тогда, объясняя $ рекурсивного и Containable поведения:
Recursive является значение от -1 до 2, и в основном это говорит модель «Я хочу, чтобы принести эту запись и все записи, связанные с ним», если он установлен в 2. Если это -1, то с помощью find или read вы получите только , что данные модели. Containable давайте укажем, какие модели/поля других моделей вы хотите получить (они должны иметь ассоциацию, хотя).

Я много раз повторял, что не являюсь поклонником $recursive != -1, потому что я чувствую, что он не позволяет вам контролировать, какие данные вы извлекаете и когда это делается. Я рекомендую вам использовать

class AppModel extends Model { 
public $actsAs = array('Containable'); 
public $recursive = -1; 

    //etc 
} 

в AppMdel, так что все не является рекурсивным и Containable по умолчанию (это не является необходимым для запроса на работу, хотя). Тогда, в отношении вашего вопроса, запрос на поиск должен быть похож на

$A = $this->A->find('first', array('conditions'=>array('id'=>$id), 
            'contain'=>array('B-model'=>array('C-model')))); 
+0

Пример @nmerson nun точно такой же, за исключением того, что массив «содержать» передается в качестве аргумента для вызова find. Кроме того, монахини, сдерживаемое поведение переопределяет рекурсивную функциональность, если обеспечивается сдерживание. (Я верю) Итак, я думаю, вы могли бы даже опустить свойство в классе. –

+0

@ Drewdiddy611, я не знал этого :) Но, проверяя документы, я считаю, что вам нужно установить рекурсивный вариант сдерживаемого поведения в true. Я имею в виду, что по умолчанию установлено значение true, но это также возможность отключить автоматическую «рекурсивность» (... это слово?). – Nunser