2013-04-24 1 views
0

У меня довольно типичная модель комментария, в которой комментарий принадлежит многим другим моделям, таким как статья, обзор, фотография и т. Д. И, в свою очередь, каждая из этих моделей hasmany Comment. Вот как я построил отношения на модели Комментария ...CakePHP 2.4.2: Комментарии Отношения модели - Получите оригинальное название записи

<?php 
App::uses('AppModel', 'Model'); 

class Comment extends AppModel { 

var $name = "Comment"; 


public $belongsTo = array(
    'User' => array(
     'className' => 'User', 
     'foreignKey' => 'user_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Article' => array(
     'className' => 'Article', 
     'foreignKey' => 'post_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Photo' => array(
     'className' => 'Photo', 
     'foreignKey' => 'post_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ), 
    'Review' => array(
     'className' => 'Review', 
     'foreignKey' => 'post_id', 
     'conditions' => '', 
     'fields' => '', 
     'order' => '' 
    ) 
); 
} 

Это работает как шарм, в котором, если я просматриваемой определенную статью, то я могу получить все комментарии из этой статьи, и она работает так же для другие модели. То, что я пытаюсь сделать, это показать ВСЕ последние комментарии с названием исходного сообщения независимо от того, какая модель оригинального сообщения исходит от (статья, обзор, фотография и т. Д.) В формате $comment['Original']['title']. Я думал, добавив следующий код в belongsto модели Комментарий будет работать, но это не делает ....

'Original' => array(
     'className' => 'Article', 
     'foreignKey' => 'post_id', 
     'conditions' => array('Comment.module_id' => 3), 
     'fields' => '', 
     'order' => '' 
    ), 
    'Original' => array(
     'className' => 'Review', 
     'foreignKey' => 'post_id', 
     'conditions' => array('Comment.module_id' => 2), 
     'fields' => '', 
     'order' => '' 
    ), 
    'Original' => array(
     'className' => 'Photo', 
     'foreignKey' => 'post_id', 
     'conditions' => array('Comment.module_id' => 8), 
     'fields' => '', 
     'order' => '' 
    ), 

К сожалению, это только показывает правильное название, если недавний комментарий был на фото (Comment.module_id = 8).

+0

Вместо того, чтобы редактировать свой вопрос с совершенно новым вопросом, вы должны это сделать и задать другой вопрос о том, почему ваш сбой работает не так, как ожидалось ... и т. Д. – Dave

+0

См. Вопрос http://stackoverflow.com/questions/16205520/cakephp-2-4-2-contains-not-working-as-expected – bowlerae

ответ

2

Вы можете использовать CakePHP-Containable Behavior и сделать это:

//within a method of the Comment model 
$recentComments = $this->find('all', array(
    'contain' => array(
     'Article', 
     'Photo', 
     'Review', 
     'User' 
    ), 
    'limit' => 10, 
    'order' => $this->alias . '.created DESC' 
)); 

Тогда вы получите обратно комментарии и любой из их родителей, независимо от того, какую модель он в После этого, как вы повторите через каждый. комментарий, вы можете либо сделать case case, либо if(!empty()), чтобы определить, какая модель имеет контент, который вы хотите отобразить.

(примечание стороны: не очень хорошая идея, чтобы создать несколько ассоциаций с тем же именем в вашу попытку с «Original»)

+0

'' заказать '=> $ this-> alias. «.created DESC'' дал мне ошибку. Если бы изменилось на '' order '=>' Comment.created DESC'', цикл не будет таким же красивым, но, по крайней мере, он работает. Благодарю. – bowlerae

+0

ok У меня есть 2 проблемы с этим, см. Правки в вопросе – bowlerae

+0

, это был правильный ответ, но это действительно замедлило мое приложение из-за того, как была настроена моя структура базы данных. У меня были статьи, обзоры, фотографии и т. Д. В разных таблицах, а таблица называлась модулями, каждая из которых была строкой и имела уникальный идентификатор. В таблице комментариев был столбец с именем module_id. Теперь я переместил все в таблицу posts и продолжаю иметь столбец module_id таким образом, если у меня есть боковая панель и вы хотите показать самые последние статьи, я могу просто установить условия поиска для module_id = 3. В любом случае, теперь модель Post имеет много Комментарий, но комментарий - это просто псевдоним для публикации. – bowlerae

0

Это не удивительно, что вы получили комментарии только с условиями Comment.module_id = 8. Вы сделали базовую ошибку PHP. Используя один и тот же ключ Original несколько раз, вы каждый раз переписываете его значение. Выберите уникальные псевдонимы (ключи массива) для каждой ассоциации.

+1

Вы правы, но это просто причина, по которой это не работает - не ответ. Если он дает им каждый другой псевдоним, тогда нет никаких оснований для их псевдонима - просто используйте саму модель (за ответ, который я уже дал). – Dave

+1

«Выберите уникальные псевдонимы (ключи массива) для каждой ассоциации». Это ответ. Псевдоним может быть таким же, как имя класса модели или другой. – ADmad