2015-11-29 4 views
0

Я не уверен в заголовке вопроса, но попытался объяснить ниже. Заранее благодарю всех, кто мне помогает.Вложенный результат при использовании CakePhp Containable

Я попробовал таблицы, чтобы упростить свои вопросы.

DB Таблица

  • Новости: news_id, название
  • Комментариев: comment_id, news_id, контент, созданное (метка время)

Пользователей публикуют комментарии к новостям. При поиске с вводом «интервала дат 01.10.2015 - 05.11.2015» результат должен включать: новости, которые были прокомментированы между этим интервалом. И comment_count следует показывать рядом с заголовком на экране. Этот comment_count не является целым comment_count, а только счетчиком между этими датами.

Для этого я сначала запросил запрос в комментариях. Затем подсчитайте комментарии. Затем group by news_id.

$Data = $this->Comment->find('all', array(
     'fields' => array(
      'News.news_id','News.title' 
     ), 
     'conditions' => array(
      "Comment.created >=" => date('Y-m-d', strtotime("-1 days")) //yesterday's commented news 
     ), 
     'contain' => array(
      'News' => array(
       'Comment => array(
        'fields' => array('COUNT(Comment.id) as comment_count'), 
       ) 
      ) 
     ), 
     'group' => array('News.title') 
    )); 

Результат ниже слишком много вложенности:

Array 
(
    [0] => Array 
     (
      [News] => Array 
       (
        [id] => 27 
        [title] => sample news title 
        [News] => Array 
         (
          [id] => 27 
          [title] => sample news title 
          [Comment] => Array 
           (
            [0] => Array 
             (
              [News_id] => 27 
              [Comment] => Array 
               (
                [0] => Array 
                 (
                  [Comment_count] => 1 
                 ) 
               ) 
             ) 
           ) 
         ) 
       ) 
     ) 
) 

В заключении, чтобы достичь COMMENT_COUNT, я должен написать вложения вручную. Однако я хотел бы достичь его на одном уровне с первым узлом [title].

$JsonData [] = array(
      "id" => $Item["News"]["id"], 
      "title" => $Item["News"]["title"], 
      "comment_count" => $Item["News"]["News"]["Comment"][0]["Comment"][0]["comment_count"] 
      ); 

Как я могу сократить продолжительность жизни?

Заранее спасибо.

ответ

1

Прежде всего, вы должны назвать свой идентификатор таблицы как id не news_id. На ваш вопрос, я не уверен, с какого контроллера вы показываете новости, IMO это должно быть сделано в NewsController. Вот как вы можете получать новости с комментариями за предыдущий день:

$Data = $this->News->find('all', array(
'fields' => array(
    'News.id', 
    'News.title', 
    'COUNT(Comment.id) as comment_count' 
), 
'group' => array('News.id'), 
'joins' => array(
    array(
     'table' => 'comments', 
     'alias' => 'Comment', 
     'conditions' => array(
      'News.id = Comment.news_id', 
      'Comment.created >=' => date('Y-m-d', strtotime("-1 days")) 
     ) 
    ) 
) 

));

Это должно дать вам результирующий массив как это:

array(
(int) 0 => array(
    'News' => array(
     'id' => '1', 
     'title' => 'New news' 
    ), 
    (int) 0 => array(
     'comment_count' => '2' 
    ) 
), 
(int) 1 => array(
    'News' => array(
     'id' => '2', 
     'title' => 'Seconds news' 
    ), 
    (int) 0 => array(
     'comment_count' => '1' 
    ) 
), 
) 

Тогда вы можете получить свой комментарий подсчет (предполагая через петлю Еогеасп):

... "comment_count" => $Data[0]['comment_count'] ... 

Вы должны смотреть counterCache это может быть полезно вы.

+0

Привет, @skywalker, Спасибо за вашу большую помощь. На самом деле, в моем db, это был идентификатор вместо news_id, но я дал его здесь, чтобы упростить мою проблему. Кажется, моя проблема решена, но все равно без использования соединения. Я бы предпочел использовать существующие модельные отношения Cake. Благодарю. – hrnsarac

+0

Как я уже сказал, вы можете попробовать с counterCache, но таким образом вы не можете получать комментарии за заданный период времени, а всего лишь количество комментариев для данной новости. Я не уверен, что вы можете сделать это, а затем использовать 'join'. – skywalker

+0

В этом результате мне не нужны детали комментариев. Мне нужно только commentCount с заданным интервалом дат. Позвольте мне попробовать counterCache. Благодарю. – hrnsarac

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