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;
}
Это кажется грубым вопросом, но я уверен, что это широко сделано и задокументировано, я был бы очень признателен за любую помощь.
2 answers
Похоже, у вас все настроено нормально. Все, что вам нужно сделать, это установить рекурсивное значение 2, и это должно дать вам дополнительный уровень для ваших данных (при условии, что вы правильно настроили все отношения)
var $recursive =2;
Альтернативное, более хирургическое решение, которое особенно полезно, если вам нужно углубиться более чем на 2 уровня или если у вас много ассоциаций 2-го уровня, которые вам не нужны для этой конкретной проблемы, - это Сдерживаемое поведение. Это документация 1.2.x. Если вы используете версию v1.3.x, вы найдете ее здесь.