2013-08-10 4 views
0

Я новичок в CakePHP и просто хочу отобразить список связанных тегов в представлении сообщения.CakePHP display HABTM ассоциации

Я искал по сети и ничего не работает.

Это то, что у меня есть на данный момент:

// PostController 
public function view($id = null) { 
    $this->set('tags', $this->Post->Tag->find('all', array('conditions' => array('PostTag.post_id' => $id)))); 

    if (!$id) { 
     throw new NotFoundException(__('Invalid post')); 
    } 

    $post = $this->Post->findById($id); 
    if (!$post) { 
     throw new NotFoundException(__('Invalid post')); 
    } 
    $this->set('post', $post); 
} 

// Post's view.ctp 
echo $this->Text->toList($tags); 

Это ошибка, я получаю:

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'PostTag.post_id' in 'where clause' 

Это должно быть так легко, но я полностью застрял.

Спасибо всем, кто может помочь!

ответ

0

Наконец! Найдя еще один вопрос о соединении таблиц и некоторых экспериментах, я получил его на работу.

public function view($id = null) { 
    $options = array(
     'joins' => array(
      array('table' => 'posts_tags', 
       'alias' => 'PostTags', 
       'type' => 'left', 
       'conditions' => array(
        'Post.id = PostTags.post_id' 
       ) 
      ), 
      array('table' => 'tags', 
       'alias' => 'Tag', 
       'type' => 'left', 
       'conditions' => array(
        'PostTags.tag_id = Tag.id' 
       ) 
      ) 
     ) 
     ,'conditions' => array(
      'PostTags.post_id' => $id 
     ) 
     ,'fields' => array(
      'Tag.title' // the name of the tag 
     ) 
     ,'recursive' => -1 
    ); 

    $tagsList = $this->Post->find('all', $options); 

    // added $result and foreach to ensure that all results would be printed 
    $result = array(); 
    foreach ($tagsList as $tag): 
     array_push($result, $tag['Tag']['title']); 
    endforeach; 

    $this->set('tags', $result); 

    // ... rest of the call to find the post info 
} 

// Post's view.ctp 
echo $this->Text->toList($tags); 

Прежде чем добавить $ result, он будет распечатывать только первую ассоциацию. Я использовал «echo pr ($ tags)»; на мой взгляд, и обнаружил, что результаты, которые я хотел, были вложены внутри двух массивов. После того, как я добавил foreach, он будет правильно перечислять все назначенные теги в моем представлении.

+0

На самом деле, я решил перенести это в мою пост-модель, так как это специфическое взаимодействие с db. Я переместил его в свою собственную публичную функцию и изменил «$ tagsList = $ this-> find (« все », $ options); – kfrankl1

0

Является ли модель тега загруженной в ваш постконтроллер? Как насчет просто:

$this->set('tags', $this->Tag->find('all', array('conditions' => array('Tag.post_id' => $id))));

+0

К сожалению, это не сработает; Я получаю «Ошибка: вызов функции-функции-члена() для не-объекта». Поскольку это HABTM, мне кажется, что мне нужно вызвать таблицу posts_tags и найти где post_id = $ id. Я не могу понять, как это сделать (если это действительно то, что я должен делать). – kfrankl1

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