2014-11-02 3 views
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. Для каждой любимой, загружать соответствующие данные предустановленные

Это самый код, который я использую, чтобы сделать это:

// 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), ассоциация загружается и я могу получить доступ к информации из таблицы предустановок.

Может быть, это ошибка или я делаю что-то не так?
Спасибо за помощь!

ответ

1

Я думаю, вам нужно позвонить ->autoFields(true) после select(). Это необходимо, если вы ожидаете, все остальные поля должны быть выбраны. Это, вероятно, может рассматриваться как ошибка, попробуйте открыть билет в github.

+0

Это решило. Я бы никогда не нашел это сам. Спасибо! –

+0

Не ошибка. По дизайну, используя выделение с ограничениями. Из руководства «Если вы ограничены полями, которые вы загружаете с помощью select(), но также хотите, чтобы поля не заполнялись содержащимися ассоциациями, вы можете использовать autoFields()' (http://book.cakephp.org/3.0/en/ ОРМ/при получении-данных и resultsets.html-# ближнего условие к содержит) – Oberst