2012-05-18 2 views
1

У меня есть вопрос относительно ассоциации моделей. Рассмотрим следующее приложение: каждый месяц пользователю задают новый вопрос. Они имеют возможность дать отзыв по этому вопросу, и у других пользователей есть возможность реагировать на этот отзыв. Моя модель-установка выглядит так:Cake PHP, соединяющий ту же модель на двух таблицах

Users hasMany Tips, Reactions 

Tips belongsTo User 

Tips hasMany Reactions 

Reactions belongsTo User, Tip 

Теперь я хочу, чтобы получить все советы по этому вопросу от всех пользователей. Я просто нахожу все на подсказках, которые возвращают мне все советы, связанные с их пользователями и реакциями. Однако реакции не содержат пользователя, что очень важно, очевидно.

Торт автоматически преобразует мои поисковые запросы в два запроса: один в таблице подсказок, соединяющий пользователя и один в таблице реакций, но нет никакого соединения в таблице users, и это то, что мне нужно.

Итак, мой вопрос: почему таблица пользователей не связана с реакциями и как я могу это решить?

Код:

User-модель:

public $hasMany = array('Tip', 'Reaction'); 

Tip-модель:

public $hasMany = array('Reaction' => array(
     'foreignKey' => 'tip_id' 
    )); 

public $hasOne = array('User' => array(
     'fields' => array(
      'User.id, User.first_name, User.last_name' 
     ), 
     'foreignKey' => 'id' 
    )); 

Reaction-модель:

public $belongsTo = array('Tip', 'ReactionUser' => array(
     'className' => 'User', 
     'foreignKey' => 'id' 
    )); 

Контроллер:

$tips = $this->Tip->find('all'); 

ВЫВОД:

array(
    (int) 0 => array(
     'Tip' => array(
      'id' => '1', 
      'user_id' => '1', 
      'question_id' => '1', 
      'tip' => 'Testing da new datavbase', 
      'votes' => '0', 
      'approved' => '1', 
      'pic' => '', 
      'created' => '2012-05-18 09:22:56' 
     ), 
     'User' => array(
      'id' => '1', 
      'first_name' => 'Bart', 
      'last_name' => 'De Bock' 
     ), 
     'Reaction' => array(
      (int) 0 => array(
       'id' => '1', 
       'tip_id' => '1', 
       'user_id' => '1', 
       'reaction' => 'lorem ipsum', 
       'votes' => '0', 
       'approved' => '1', 
       'pic' => '', 
       'created' => '0000-00-00 00:00:00' 
      ) 
     ) 
    ), 
    (int) 1 => array(
     'Tip' => array(
      'id' => '2', 
      'user_id' => '2', 
      'question_id' => '1', 
      'tip' => 'Test', 
      'votes' => '0', 
      'approved' => '1', 
      'pic' => '', 
      'created' => '2012-05-18 10:22:51' 
     ), 
     'User' => array(
      'id' => '2', 
      'first_name' => 'Deborah', 
      'last_name' => 'Rochtus' 
     ), 
     'Reaction' => array(
      (int) 0 => array(
       'id' => '2', 
       'tip_id' => '2', 
       'user_id' => '3', 
       'reaction' => 'Say whaat?', 
       'votes' => '2', 
       'approved' => '1', 
       'pic' => '', 
       'created' => '2012-05-18 10:33:32' 
      ), 
      (int) 1 => array(
       'id' => '3', 
       'tip_id' => '2', 
       'user_id' => '4', 
       'reaction' => 'Hmmm..', 
       'votes' => '0', 
       'approved' => '1', 
       'pic' => '', 
       'created' => '2012-05-18 10:33:44' 
      ) 
     ) 
    ) 
) 

Как вы можете видеть, эти реакции не содержат соответствующий пользователь ...

Спасибо за вашу помощь!

+0

показать мне свой код ,, что у вас пробовали ?? –

+0

, пожалуйста, покажите мне ваш полный код контроллера .... ур модальный выглядит хорошо .. –

+0

Сделано, обновлено выше – baRToooo

ответ

0

Использование Containable:

В AppModel:

public $uses = array('Containable');

Измените свой находкой вызов:

$this->Tip->find('all', array('contain' => array('User', 'Reaction' => array('User'))));

0

Пожалуйста, попробуйте этот

$tips = $this->Tip->find('all' array( 'recursive'=>'2' ) );

Рекурсивное значение, возможно, 1, 2, 3, 4 и так далее, как вам нужно.

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