Codeigniter передает запрос или сгенерированный массив запросов контроллеру

#php #mysql #codeigniter

#php #mysql #codeigniter

Вопрос:

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

Контроллер

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

Вид

 <?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();
  

Вид

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

Считается ли один из них лучшим стандартом кодирования? Является ли один из них более эффективным, чем другой?

Комментарии:

1. Ничто из этого никоим образом не связано с шаблоном проектирования MVC.

Ответ №1:

Как уже сказал пинадельсай, логика подсказывает поместить ваш запрос внутри модели. Этот сервер преследует 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, вам просто нужно будет изменить способ вызова значений (используя нотацию массива или объектную нотацию).


Обновить:

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

  $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 начинается как пустой массив. Если строки возвращаются, массив заполнен, в противном случае возвращается пустым, как есть. И затем вы решаете в своем представлении (или в нашем контроллере, если вам нужно загрузить совершенно другое представление в случае), как дифференцировать это условие, выполняя то, что вы уже делаете в своем коде.


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

Комментарии:

1. Спасибо! Тогда я должен создать другое представление, когда я не получу результатов? Таким образом, вся логика будет в моем контроллере?

2. Ну, нет, ваше представление выглядит нормально; Я обновлю свой код, дайте мне минуту

Ответ №2:

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

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

Надеюсь, здесь я прояснил основную мысль.

Спасибо.