ООП, MVC - Модели и объекты - PullRequest
       1

ООП, MVC - Модели и объекты

0 голосов
/ 28 января 2011

Я создаю сайт с CodeIgniter, и у меня есть модель с именем Blog_model.

В Blog_model существуют методы для получения списка сообщений по определенной теме, например, getPopularPosts().

getPopularPosts() запрашивает в таблице сообщений список сообщений с topic_id, соответствующим указанному, и сортирует их по популярности. Итак, это один запрос ко всей таблице постов (предположим, что в конечном итоге это будет очень много), чтобы найти все посты с topic_id x .

Затем foreach результат as индивидуальный идентификатор записи, он создает новый Post объект. Класс Post создает сообщение, устанавливая поле id.

Чтобы вернуть содержимое Post, я назначаю $post->getPost();, который снова запрашивает таблицу сообщений, чтобы вернуть всю строку для заданного id.

Эта организация (AFAIK) следует хорошему объектно-ориентированному принципу. Но теперь, для каждого сообщения (опять же, давайте предположим, тысячи, миллионы, что угодно ...), я должен сначала запросить список id с, а затем снова, чтобы получить содержание каждого сообщения. Если я возвращаю 30 сообщений, это означает 31 отдельный запрос.

Кроме того, я мог бы разбить объектно-ориентированный шаблон и вытянуть * для каждого поста в posts, где topic_id = x . Затем у меня есть один запрос, который возвращает все 30 сообщений, но теперь я не чувствую себя объектно-ориентированным.

Что делать?

1 Ответ

3 голосов
/ 28 января 2011

Нет причин иметь столько запросов.По сути, вы просто ищете 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';
         }

     }

 }

Естьбесполезно (и на самом деле это большая проблема) с генерацией тонны запросов в том виде, в котором вы в данный момент его настроили, по сравнению с генерацией одного объекта из запроса и итерацией по каждой из строк в контроллере и выполнением того, что вам нужно сданные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...