2012-06-25 2 views
0

почта имеет пользователя (принадлежит), а у пользователя есть профиль (hasOne). Обычно все работает: я могу получить доступ от Почты к Пользователю и от пользователя к профилю.Cakephp: ассоциации ассоциаций в «полях»

Из почты все работает с использованием общего поиска. В результате более или менее это (я удалил некоторые ключи, только для примера):

array(
    'Post' => array(
     'id' => '1', 
     'category_id' => '1', 
     'user_id' => '1', 
     'title' => 'Example', 
     'text' => '', 
    ), 
    'User' => array(
     'password' => '*****', 
     'id' => '1', 
     'group_id' => '1', 
     'username' => 'mirko', 
     'status' => 'active', 
     'Profile' => array(
      'id' => '1', 
      'user_id' => '1', 
      'first_name' => 'Mirko', 
      'last_name' => 'Pagliai', 
     ), 
    ) 
) 

Проблема возникает, когда я использую «поля», когда я хочу, чтобы извлечь лишь несколько полей. Например, это работает:

'fields'  => array('id', 'title', 'User.id') 

и результат:

array(
    'Post' => array(
     'id' => '1', 
     'title' => 'Articolo di prova :-)' 
    ), 
    'User' => array(
     'id' => '1' 
    ) 
) 

Но я не понимаю, всегда используя "поля", как получить доступ к Profile. Эти don'yt работы:

'fields'  => array('id', 'title', 'User.id', 'Profile.id') 

'fields'  => array('id', 'title', 'User.id', 'User.Profile.id') 

Я всегда получаю эту ошибку "Error: SQLSTATE [42S22]: Column не найдено: 1054 Unknown столбца 'User.Profile.id' в 'списке полей'".

Что случилось? Благодарю.

EDIT: Я не использую Контейнерное поведение. Может, это проблема? В этом случае важно?

Например, при использовании: разбивать на страницы

$this->paginate = array(
    'conditions' => $conditions, 
    'fields'  => array('id', 'title', 'User.id', 'Profile.id'), 
    'limit'   => 10, 
    'recursive'  => 2, 
); 

EDIT2: благодаря @Hoff, я близок к разгадке. Но есть еще что-то не так (и Containable очень полезно!). В AppModel.php я добавил:

... 
class AppModel extends Model { 
    public $actsAs = array('Containable'); 
    public $recursive = -1; 
... 

Но это не работает:

$this->paginate = array(
      'conditions' => $conditions, 
      'contain'  => array(
       'User' => array(
        'fields' => array('id'), 
        'Profile' => array(
         'fields' => array('id', 'full_name'), 
        ), 
       ), 
       'Category' => array(
        'fields' => 'title', 
       ), 
      ), 
      'fields'  => array('id', 'user_id', 'category_id', 'title', 'created', 'modified', 'published'), 
      'limit'   => 10, 
     ); 

Потому что я получаю:

array(
    (int) 0 => array(
     'Post' => array(
      'id' => '1', 
      'user_id' => '1', 
      'category_id' => '1', 
      'title' => 'Articolo di prova :-)', 
      'created' => '2012-06-21 18:46:00', 
      'modified' => '0000-00-00 00:00:00', 
      'published' => true 
     ), 
     'Category' => array(
      'title' => 'prova', 
      'id' => '1' 
     ), 
     'User' => array(
      'id' => '1' 
     ) 
    ) 
) 

, но если добавить любое поле для пользователя (по электронной почте , имя пользователя, пароль и т. д.), это работает:

  'User' => array(
       'fields' => array('id', 'username'), 
       'Profile' => array(
        'fields' => array('id', 'full_name'), 
       ), 
      ), 

И я получаю:

array(
    (int) 0 => array(
     'Post' => array(
      'id' => '1', 
      'user_id' => '1', 
      'category_id' => '1', 
      'title' => 'Articolo di prova :-)', 
      'created' => '2012-06-21 18:46:00', 
      'modified' => '0000-00-00 00:00:00', 
      'published' => true 
     ), 
     'Category' => array(
      'title' => 'prova', 
      'id' => '1' 
     ), 
     'User' => array(
      'id' => '1', 
      'username' => 'mirko', 
      'Profile' => array(
       'id' => '1', 
       'full_name' => 'Mirko Pagliai' 
      ) 
     ) 
    ) 
) 
+0

Могу ли я увидеть ваш найти вызов? Кроме того, используете ли вы поведение Containable? – Hoff

+0

Я ответил, отредактировав первое сообщение –

ответ

1

Вместо того чтобы использовать ключ «рекурсивный», я настоятельно рекомендую использовать Containable поведение. Документацию о поведении можно найти here. Я бы предложил применить поведение в вашем AppModel, поэтому вам не нужно добавлять его ко всем вашим моделям. В модели/AppModel.php:

App::uses('Model', 'Model'); 
class AppModel extends Model { 
    public $actsAs = array('Containable'); 
    public $recursive = -1; 
} 

Тогда для пагинацией:

$this->paginate = array(
    'conditions' => $conditions, 
    'fields'  => array('id', 'title'), 
    'limit'   => 10, 
    'contain' => array(
     'User' => array(
      'fields' => array('id'), 
      'Profile' => array(
       'fields' => array('id') 
      ) 
     ) 
    ) 
); 
+0

Это не может работать, потому что сообщение и профиль не имеют прямого отношения. Фактически я получаю сообщение об ошибке: Предупреждение (512): Модель «Почта» не связана с моделью «Профиль» [CORE/Cake/Model/Behavior/ContainableBehavior.php, строка 339] Вместо этого ваш пример работает с пользователем , –

+0

Вы можете вложить столько уровней, сколько хотите, см. Мое редактирование. Извините, я пропустил модель! Должно быть исправлено сейчас. – Hoff

+0

Спасибо @Hoff, я близок к решению. Но есть еще что-то не так. Посмотрите мое первое сообщение (отредактировано), спасибо! –

Смежные вопросы