0

我正在用CodeIgniter構建一個站點,我的模型名爲Blog_modelOOP,MVC - 模型和對象

Blog_model之內,有一些方法可以爲特定主題提取帖子列表,例如,getPopularPosts()

getPopularPosts()查詢帖子表以獲得與指定的匹配的topic_id的帖子列表,並按受歡迎程度排序它們。因此,這是針對整個帖子的一個查詢(讓我們假設這將是非常大的最終)找到所有帖子topic_idx

然後,foreach結果as單個帖子ID,它創建一個新的Post對象。 Post類通過設置字段id來構建帖子。

要返回Post的內容,我分配了$post->getPost();,它再次查詢帖子表以返回給定的id的整個行。

這個組織(AFAIK)遵循一個很好的面向對象的原則。但現在,對於每一篇文章(再次假設成千上萬,......),我必須首先查詢id s的列表,然後再次獲取每篇文章的內容。如果我要返回30個帖子,則表示31個單獨的查詢。

可替換地,我可以打破面向對象模式和在其中posts = topic_idX*對於每個柱。然後,我有一個查詢返回所有30個帖子,但現在我不覺得如此面向對象。

怎麼辦?

+0

你覺得「感覺如此面向對象」很重要嗎? - 如果您擔心性能或其他問題,可以將其作爲完整的更改後的後端運行,並將結果寫入平面文本文件。那麼你甚至不需要爲每個帖子運行查詢,你可以使用初始查詢中的id來顯示緩存文件的結果。但是,如果你正在尋找一個評論,選擇你提到的選項之一,我會去加入一個查詢。如果我沒有弄錯的話,代碼點火器並不是嚴格的oo。我認爲Kohana是,他們有ORM來做你想做的事情。 –

+0

如果它有所不同,它是CodeIgniter 2. – Peter

+0

在你的問題中有很多信息,如果你想讓它們在這裏得到適當的解決,請給出代碼的具體例子。 – jondavidjohn

回答

3

沒有理由有這麼多的查詢。你基本上只是尋找來自特定主題ID的X個帖子......你應該把它作爲一個對象返回,然後遍歷PHP中的結果,因爲一旦你得到有幾百萬行的點

你應該去了解它更多的是這樣的:

class blog_model extends CI_Model { 

    function __construct(){ 
     parent::__construct(); 
    } 

    function getPopularPosts($cat_id){ 
     /* Using method chaining here since you sound like you 
      really want to utilize everything OO CI has to offer */ 
     $posts = $this->db->select('id, title, post_info') 
        ->where('topic_id', $topic_id) 
        ->get('posts'); 

     if($posts->num_rows() > 0){ 
      return $posts; 
     }else{ 
      return FALSE; 
     } 
    }  
} 

那麼你的控制器是這樣的:

class blog extends CI_Controller { 

    function __construct() { 
     parent::__construct(); 
    } 

    function blog_posts($popular_post_id) { 
     $this->load->model('blog_model'); 
     $posts = $this->blog_model->getPopularPosts($popular_post_id); 

     if(!empty($posts){ 
      foreach($posts as $post){ 
       echo $post->id; 
       echo $post->title; 
       echo $post->post_info; 
      } 
     }else{ 
      echo 'There are no posts'; 
     } 

    } 

} 

沒有好處(實際上是一大問題),並在f中產生大量的查詢您現在已經設置了它,vs從查詢中生成一個對象,並遍歷控制器中的每一行,並根據數據執行所需的任何操作。

+0

但是在OOP的精神中(也許這意味着錯過了樹林),將這樣的邏輯放在Post類中不是更正確嗎?因爲也許我想獲得特定帖子的回覆。使用你的方法,這會把'getPost()'和'getReplies()'放在同一個類下;而在我看來'getReplies()'應該是Post類的一個方法。 – Peter

+1

是的,我認爲你完全錯過了OOP實際上意味着什麼以及如何實現它......如果你要獲得單個條目的回覆,那應該是blog_posts模型中的一個不同功能,並且只能查詢對於一個特定的博客帖子ID ...如果你將得到多個帖子的多個回覆,那麼你將會想要做一些MySQL JOIN。一種簡單的方法是,您的目標應該是儘可能使用最少數量的查詢來完成您所需的操作。面向對象只是一種讓事情保持組織的方式。 – tgriesser

+0

值得一提的是,我最初以你描述的方式設置了一些東西。根據你的回答,我已經恢復到這個設置。代碼的總體權重與'Post'和'Reply'類相似,即使事情沒有我想要的那樣組織,它仍然非常幹。另外,我可以運行一個查詢來代替'(_number-of-posts_)+ 1'。 – Peter