CakePHP 3-уровневые глубокие ассоциации моделей


Я относительно новичок в CakePHP, у меня все хорошо с документацией, но я уже несколько недель пытаюсь найти выход из этой проблемы, и, похоже, я не нахожу решения, я уверен, что это легко и, возможно, даже автоматически выполнимо, но я просто не знаю, как его найти (возможно, я не знаю жаргона для подобных вещей)

Структура моей модели выглядит следующим образом:

<?php
    class Trip extends AppModel {
          var $belongsTo = array(
            'User' => array(
                'className' => 'User',
                'foreignKey' => 'user_id'
            ),
            'Start' => array(
                'className' => 'Place',
                'foreignKey' => 'start_id'
            ),
            'End' => array(
                'className' => 'Place',
                'foreignKey' => 'end_id'
            ),
            'Transport' => array(
                'className' => 'Transport',
                'foreignKey' => 'transport_id'
            )
        );

     }
?>

<?php
class Place extends AppModel {

    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        ),
        'Country' => array(
            'className' => 'Country',
            'foreignKey' => 'country_id'
        ),
        'State' => array(
            'className' => 'State',
            'foreignKey' => 'state_id'
        ),
        'City' => array(
            'className' => 'City',
            'foreignKey' => 'city_id'
        )
    );
    var $hasMany = array(
        'PlaceStart' => array(
            'className' => 'trip',
            'foreignKey' => 'start_id',
            'dependent' => false
        ),
        'PlaceEnd' => array(
            'className' => 'trip',
            'foreignKey' => 'end_id',
            'dependent' => false
        )
    );

}
?>

<?php
class State extends AppModel {

    var $belongsTo = array(
        'Country' => array(
            'className' => 'Country',
            'foreignKey' => 'country_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    var $hasMany = array(
        'City' => array(
            'className' => 'City',
            'foreignKey' => 'city_id',
            'dependent' => false
        )
    );

}
?>

... и так далее с моделями пользователей, городов, стран и транспорта.

Кто я такой попытка достичь состоит в том, чтобы получить всю информацию обо всем дереве, когда я ищу Trip.

<?php
class TripController extends AppController {
    function index() {
        debug($this->Trip->find('first'));
    }
}

Выходные данные

Array
(
    [Trip] => Array
        (
            [id] => 6
            [created] => 2010-05-04 00:23:59
            [user_id] => 4
            [start_id] => 2
            [end_id] => 1
            [title] => My trip
            [transport_id] => 1
        )

    [User] => Array
        (
            [id] => 4
            [name] => John Doe
            [email] => [email protected]
        )

    [Start] => Array
        (
            [id] => 2
            [user_id] => 4
            [country_id] => 1
            [state_id] => 1
            [city_id] => 1
            [direccion] => Lincoln Street
        )

    [End] => Array
        (
            [id] => 1
            [user_id] => 4
            [country_id] => 1
            [state_id] => 1
            [city_id] => 4
            [address] => Fifth Avenue
        )

    [Transport] => Array
        (
            [id] => 1
            [name] => car
        )
)

Вот в чем вопрос: Как мне получить в одном запросе всю информацию по дереву?

Я хотел бы иметь что-то вроде

Array
(
    [Trip] => Array
        (
            [id] => 6
            [created] => 2010-05-04 00:23:59
            [User] => Array
                (
                    [id] => 4
                    [name] => John Doe
                    [email] => [email protected]
                )
            [Start] => Array
                (
                    [id] => 2
                    [user_id] => 4
                    [Country] => Array
                        (
                            [id] => 1
                            [name] = Spain
                        )
                    [State] => Array
                        (
                            [id] => 1
                            [name] = Barcelona
                        )
                    [City] => Array
                        (
                            [id] => 1
                            [name] = La Floresta
                        )
                    [address] => Lincoln Street
                )
            [End] => (same as Start)
            [title] => My trip
            [Transport] => Array
                (
                    [id] => 1
                    [name] => car
                )
        )
)

Может ли CakePHP создавать такого рода данные? Не только для $this->Model->find(), но и для $this->paginate(), например:

    // filter by start
    if(isset($this->passedArgs['start'])) {
        //debug('isset '.$this->passedArgs['start']);
        $start = $this->passedArgs['start'];
        $this->paginate['conditions'][] = array(
            'OR' => array(
                'Start.address LIKE' => "%$start%",
                'Start.State.name LIKE' => "%$start%",
                'Start.City.name LIKE' => "%$start%",
                'Start.Country.name LIKE' => "%$start%"
            )
        );
        $this->data['Search']['start'] = $start;
    }

Это кажется грубым вопросом, но я уверен, что это широко сделано и задокументировано, я был бы очень признателен за любую помощь.

Author: Brian Tompsett - 汤莱恩, 2010-06-03

2 answers

Похоже, у вас все настроено нормально. Все, что вам нужно сделать, это установить рекурсивное значение 2, и это должно дать вам дополнительный уровень для ваших данных (при условии, что вы правильно настроили все отношения)

var $recursive =2;
 6
Author: paullb, 2010-06-03 14:29:43

Альтернативное, более хирургическое решение, которое особенно полезно, если вам нужно углубиться более чем на 2 уровня или если у вас много ассоциаций 2-го уровня, которые вам не нужны для этой конкретной проблемы, - это Сдерживаемое поведение. Это документация 1.2.x. Если вы используете версию v1.3.x, вы найдете ее здесь.

 3
Author: Rob Wilkerson, 2010-06-03 14:42:49