2016-04-13 4 views
1

Мне нужно написать комментарий к статье и таблице. На домашней странице я хочу посмотреть, сколько комментариев для статьи earch.Codeigniter: передать переменную виду View

Модель

function show_latest_article($start,$display,$cate) 
{ 
    $query= $this->db->get_where('news_news', array('News_Cate_ID'=>$cate),$start,$display); 
    if($cate==0) 
    { 
     $query= $this->db->get_where('news_news',$start,$display); 
    } 

    return $query->result(); 
} 
    function count_comment($id) 
    { 
     $query = $this->db->get_where('comment',array('comment_article_id'=>$id)); 

     return $query->num_rows(); 

    } 

Контроллер

function index() { 
     $this->load->model('article'); 
     $data=array('article'=>$this->article->show_latest_article(0,8,1), 
        'sidebar'=>$this->article->side_bar(9), 
        'count_comment'=> $this->article->count_comment($id), 

      ); 

     $this->load->view('page/index',$data); 

    } 

В представлении я это

foreach($article as $art) 
{ 
    echo $art->title."<br>"; 
    $id= $art->id; 
    // I want to echo number of comment here. 
    // Or I want to call function count_comment($id) 
} 
+0

Так вы нашли решение? – Arizona2014

+0

Думаю, я попытаюсь присоединиться к двум таблицам вместо вызова другого запроса в цикле. –

+0

Это может быть быстрое решение, но, пожалуйста, рассмотрите мое решение тоже ... Я очень хочу знать, хорошо ли это для вас. По крайней мере, для этого я потратил время, чтобы записать это для вас, ребята – Arizona2014

ответ

0

Это не так ясно, где переменная $id рода, но я предлагаю присоединиться к таблице комментариев к вашей статье. Это не лучшая практика для создания запросов в циклах.

В модели:

public function show_latest_article($ids = array()) 
{ 
    return $this->db 
     ->select('articles.*, COUNT(comments.id) as comment_count') 
     ->where_in('articles.id', $ids) // You can skip this 
     ->join('comments', 'comments.article_id = articles.id', 'left') 
     ->group_by('articles.id') 
     ->get('articles') 
     ->result(); 
} 

В контроллере:

public function index() 
{ 
    $data['articles'] = $this->article->show_latest_article(array(0, 8, 1)); 
    $this->load->view('page/index', $data); 
} 

Просто измените имя поля по столбцам базы данных. Также вы можете пропустить условие where_in. (Я не уверен, что означает три числа).

Затем на ваш взгляд, вы можете просто получить доступ к полю: $art->comment_count

EDIT: В соответствии с Вашим комментарием:

$this->db 
    ->select('a.*, (SELECT COUNT(*) FROM comment c WHERE c.comment_article_id = a.News_News_ID) as counta') 
    ->get('news_news') 
    ->result(); 
+0

Ваше решение выглядит хорошо на 1 статье, но я хочу получить всю статью и ее количество комментариев. Мой идентификатор не является идентификатором статьи, а не идентификатором категории. –

+0

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

+0

Этот код работает для меня. Можете ли вы помочь мне перенести его в стиль codeigniter. SELECT a. *, (SELECT COUNT (*) FROM comment c WHERE c.comment_article_id = a.'News_News_ID') как counta FROM 'news_news' a –

1
$this->load->model('article'); 
    $data['article'] = $this->article->show_latest_article(0, 8, 1); 
    $data['sidebar'] => $this->article->side_bar(9); 
    $data['count_comment'] => $this->article->count_comment($id); 
    $this->load->view('page/index', $data); 

И он должен работать.

+0

, можете ли вы рассказать мне, в чем разница между вашим кодом и ее кодом? – Vinie

+0

Ваше решение не завершено – Arizona2014

+0

$ data ['count_comment'] должно содержать массив комментариев, потому что функция count_comment возвращает только один счетчик комментариев – Arizona2014

0

Контроллер:

function index() { 
    $this->load->model('article'); 
    $articles = $this->article->show_latest_article(0,8,1); 
    $count_comments = Array(); 
    for($i=0;$i<count($articles);$i++){ 
     $count_comments[$i] = $this->article->count_comment($articles->$id); 
    } 
    $count_comments = 
    $data=array('article'=>$articles, 
       'sidebar'=>$this->article->side_bar(9), 
       'count_comment'=> $count_comments); 

    $this->load->view('page/index',$data); 

} 

В Вид:

$i=0; 
foreach($article as $art) 
{ 

    echo $art->title."<br>"; 
    $id= $art->id; 
    echo $count_comment[$i]; 
    $i++; 
} 
+0

Использовать $ i ++ не работает, потому что идентификатор статьи не от 1 до 100, иногда я удаляю статью, затем это может испортиться. –

+0

$ i ++ не работает? LOOL ... Вы должны найти лучшую причину, по которой ++ является одним из основных операторов Code Igniter. – Arizona2014

+0

люди, как вы дать мне повод, чтобы разместить здесь знание ... Потому что reaally нужно ... Иметь хороший день Sweety – Arizona2014

0

Прежде всего в вашем контроллере вы получите count_comment только для конкретной статьи ID, а не для всех статей, так что вы не можете сделать Еогеасп для отображения количество комментариев каждой статьи.

Вам нужно настроить модель лучше и в функции модели show_latest_article использовать таблицу комментариев JOIN и подсчитать комментарий в запросе.

Я поможем вам с запросом, если вы предоставите мне больше информации о таблице базы данных статьи и комментариях.

SELECT 
    article.*, 
    COUNT(comment.id),0) AS numberOfCommments 

FROM article 
LEFT JOIN comment 
ON comment.article_id = article.id 

GROUP BY article.id 
+0

статью ( идентификатор, название, тело, user_id) комментарий ( идентификатор, article_id, user_id, body) –

+0

@NamHao Я просто отредактировал свой ответ. – Mladen

0

Я пишу этот ответ, как вы указали код. Это может быть проще, если вы дадите больше деталей базы данных. Попробуйте ниже кода

function index() { 
    $this->load->model('article'); 
    $articles = $this->article->show_latest_article(0,8,1); 

    foreach($articles as $article) 
    { 
     $article->comment_count = $this->article->count_comment($article->id); 
     $all_article[] = $article; 
    } 

    $data=array('article'=>$all_article, 
       'sidebar'=>$this->article->side_bar(9) 
     ); 

    $this->load->view('page/index',$data); 

} 

На виде

foreach($article as $art) 
{ 
    echo $art->title."<br>"; 
    $id= $art->id; 
    echo $art->comment_count; 

} 
0

Данные передаются от контроллера к представлению путем массив или объект во втором параметре функции загрузки вида.Вот пример использования массива:

$data = array(
      'title' => 'My Title', 
      'heading' => 'My Heading', 
      'message' => 'My Message' 
    ); 
$this->load->view('blogview', $data); 

Также ниже приведен пример для объекта

$data = new Someclass(); 
$this->load->view('blogview', $data); 

ОБРАТИТЕ ВНИМАНИЕ: Примечание: Если вы используете объект, то переменные класса будут преобразованы в элементы массива. Вы можете узнать больше из ниже реф URL

Ref: https://ellislab.com/codeigniter/user-guide/general/views.html

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