У меня возникают проблемы с попыткой получить связанные модели при выборе полей. Моя версия CakePHP - 3.0beta2.Ассоциации не загружаются при выборе полей
три таблицы MYSQL, которые имеют отношение к этому вопросу:
users:
`id` int(11) NOT NULL,
`username` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`role` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
... (more information)
-
presets:
`id` int(11) NOT NULL,
`name` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
`user_id` int(11) NOT NULL,
... (more information)
-
favorites:
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`preset_id` int(11) NOT NULL,
`created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Мои ассоциации определяются, как показано ниже:
// From FavoritesTable.php
public function initialize(array $config) {
$this->belongsTo('Users');
$this->belongsTo('Presets');
}
// From PresetsTable.php
public function initialize(array $config) {
$this->belongsTo('Users');
$this->hasMany('Favorites');
}
// From UsersTable.php
public function initialize(array $config) {
$this->hasMany('Presets');
$this->hasMany('Favorites');
}
То, что я пытаюсь достичь:
- нагрузки всей информации пользователя для текущего пользователя
- загрузят все избранные, что этот пользователь имеет
- Создать новое поле, которое трансформирует
created
поле (отметка времени) в дату - Для каждой любимой, загружать соответствующие данные предустановленные
Это самый код, который я использую, чтобы сделать это:
// From UsersController.php
public function favorites() {
$userId = $this->Auth->user('id');
$user = $this->Users->find('all')
->where(['id' => $userId])
->contain([
'Favorites' => function($q) {
return $q
->select(['id', 'preset_id', 'user_id', 'created', 'date' => 'DATE(created)'])
->order(['Favorites.created' => 'DESC']);
},
'Favorites.Presets',
])
->first();
$this->set('user', $user);
}
Проблема: когда я использую метод select
как в приведенном выше коде, Favorites.Presets
ассоциация не загружена, так $user['favorites'][0]['preset']
всегда null
.
Но если я закомментируйте выберите метод (таким образом, выбирающий все поля и не загружается DATE(created)
, ассоциация загружается и я могу получить доступ к информации из таблицы предустановок.
Может быть, это ошибка или я делаю что-то не так?
Спасибо за помощь!
Это решило. Я бы никогда не нашел это сам. Спасибо! –
Не ошибка. По дизайну, используя выделение с ограничениями. Из руководства «Если вы ограничены полями, которые вы загружаете с помощью select(), но также хотите, чтобы поля не заполнялись содержащимися ассоциациями, вы можете использовать autoFields()' (http://book.cakephp.org/3.0/en/ ОРМ/при получении-данных и resultsets.html-# ближнего условие к содержит) – Oberst