选择字段时不会加载关联

时间:2014-11-02 19:32:04

标签: php mysql cakephp cakephp-3.0

在选择字段时,我在尝试获取关联模型时遇到了一些麻烦。我的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');
}

我想要实现的目标是:

  1. 加载当前登录用户的所有用户信息
  2. 加载此用户拥有的所有收藏
  3. 创建一个新字段,将created字段(时间戳)转换为日期
  4. 对于每个收藏夹,加载相关的预设数据
  5. 这是我用来做的代码:

    // 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)),则加载关联,我可以从预设表中访问信息。

    这可能是一个错误,还是我做错了什么? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我认为您需要在->autoFields(true)之后致电select()。如果您希望选择所有其他字段,则必须执行此操作。这可能被视为一个错误,尝试在github中打开一张票。