У меня возникли проблемы при попытке выбрать связанные модели при выборе полей. Моя версия 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)
, ассоциация загружена, и я могу получить доступ к информации из таблицы предустановок.
Может ли это быть ошибкой или я что-то не так делаю?
Спасибо за помощь!
Я думаю, вам нужно позвонить ->autoFields(true)
после select()
, Это необходимо, если вы ожидаете, что будут выбраны все остальные поля. Возможно, это можно рассматривать как ошибку, попробуйте открыть тикет в github.
Других решений пока нет …