Codeigniter Передача запроса или сгенерированного массива запросов в контроллер - PullRequest
0 голосов
/ 07 ноября 2011

Я размышлял над тем, что является лучшим методом программирования при работе с настройкой Model-View-Controller при использовании запросов к базе данных. Должен ли я передать возвращенный запрос к контроллеру, например ...

Контроллер

$query = $this->db->get();
$this->template->write_view('content', 'work/index', array('work_query' => $query));
$this->template->render();

View

<?php if ($work_query->num_rows() == 0): ?>
    <p>There are no works</p>
<?php else: ?>
    <?php foreach($work_query->result() as $work): ?>
        //Do something
    <?php endforeach; ?>
<?php endif; ?>

Или я должен вызвать какую-то функцию из класса запросов (например, result_array()) и передать ее в представление.

Контроллер

$query = $this->db->get()->result_array();
$this->template->write_view('content', 'work/index', array('works' => $query));
$this->template->render();

View

<?php if (empty($works)): ?>
    <p>There are no works</p>
<?php else: ?>
    <?php foreach($works as $work): ?>
        //Do something
    <?php endforeach; ?>
<?php endif; ?>

Один считается лучшим стандартом кодирования? Один эффективнее другого?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Как уже сказал пинаделсай, логика подсказывает поместить ваш запрос в модель. Эти серверы преследуют 2 цели: 1) поддерживать более строгую и лучшую практику кодирования, разделяя три логики в MVC; 2) упорядочить код и упростить управление днем, когда вы захотите внести некоторые изменения в свой запрос.
Похоже, вы вызываете запрос только в виде одной сотни, но что, если вы вызываете его более одного раза и решаете однажды изменить его? Вам нужно будет проверить все виды и внести изменения в каждый из них; сохраняя логику внутри модели, вы просто меняете один метод и подаете исправленные результаты сразу всем представлениям.

Небольшое дополнение и совет: вам не обязательно вызывать функцию, возвращающую массив, чтобы получить результаты в виде массива. Делать что-то вроде (в вашей модели):

$query = $this->db->get('mytable'); // this is your fetching;
$data = array();
foreach($query->result() as $row)
{
  $data[] = $row;
}
return $data;

У вас будут свойства, которые всегда имеют форму массива ($ data), независимо от того, решите ли вы использовать result (), а затем измените его на result_array (); ваше представление будет сохранять ту же логику foreach, вам просто нужно изменить способ вызова значений (используя запись массива или запись объекта).


UPDATE:

Согласно вашему комментарию, вы можете использовать другое представление, когда у вас нет результатов (но это сильно зависит от вашего дизайна. Чаще всего вы позволяете модели передавать с данными данные о количестве для результатов. пример:

 $query = $this->db->get('mytable'); // this is your fetching;
    $data = array();
    if($query->num_rows() > 0)
    {
      foreach($query->result() as $row)
      {
        $data[] = $row;
      }
    }
    return $data;

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


Помимо всего этого, нет обязательного закона, который вам нужно принуждать. Вы можете разместить любую логику в своем представлении, и CI все равно будет работать. Строго разделение бизнес-логики, манипулирования данными и отображения данных просто гарантирует, что ваше приложение станет намного более управляемым в будущем; даже если вы будете единственным, кто управляет вашим кодом, я уверен, что через шесть месяцев, когда вы вернетесь к тем представлениям, содержащим запрос, вы будете проклинать себя за то, что не сделали «правильный» путь MVC.

0 голосов
/ 07 ноября 2011

Лучше не передавать запрос по вашему мнению.Практика простоя и основная концепция архитектуры MVC состоит в том, чтобы отделить Контроллер (Логика) - Модель (Код позади / Манипулирование данными) - Представление (Шаблоны).

Рекомендуется передать полный набор результатов в массиве представлению.Вы можете передать свой запрос для просмотра НО в редких / особых случаях.[например, вам нужны некоторые данные в нижнем колонтитуле, для этого случая вызовите запрос модели, чтобы вам не приходилось отображать запрос модели в каждой функции контроллера и передавать его в представление.]

Надеюсь,здесь я ясно изложил свою точку зрения.

Спасибо.

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