在选择字段时,我在尝试获取关联模型时遇到了一些麻烦。我的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
。
但是如果我注释掉select方法(因此选择所有字段而不是检索DATE(created)
),则加载关联,我可以从预设表中访问信息。
这可能是一个错误,还是我做错了什么? 谢谢你的帮助!
答案 0 :(得分:1)
我认为您需要在->autoFields(true)
之后致电select()
。如果您希望选择所有其他字段,则必须执行此操作。这可能被视为一个错误,尝试在github中打开一张票。