Урок 4 — Модели

Продолжаем серию уроков по CodeIgniter 2.1.0.  И в этом уроке научимся работать с моделями в Codeigniter.

Заполним базу данных и выведем на экран эту информацию используя модель фреймворка.
Вы увидите насколько просто создавать различные запросы к БД используя CodeIgniter.

Выставляйте качество видео 480р.

На прошлом уроке мы знакомились с видами и контроллерами, если Вы пропустили данный урок, то советую пройти его :)

Для того чтобы поработать с моделями, сперва нужно заполнить базу данных информацией. Я думаю с заполнением базы данных Вы справитесь и этот процесс я тут расписывать не буду :) Так что заполняйте базу данных любой информацией, которая Вам нужна.

Переходим к созданию модели. Создаем обычный .php файл, назовем его articles_model.php — как на видео. Так же рекомендую именовать модели с приставкой _model, так как Вам потом будет легче отличать файлы при работе. И сохраняем этот файл в папку application->models.

И вот базовый код, который должен быть при создании модели:


<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Articles_model extends CI_Model {

}

После слова class пишем название модели. Название тоже самое как и название нашего файла, но с БОЛЬШОЙ буквы — это важно. И в конце фраза, которая означает, что наша модель будет расширять родительскую модель фреймворка CodeIgniter. Мне эта фраза тоже ничего не дает :)

Теперь, чтобы работать с запросами нужно подключить библиотеку database. Как это сделать? Переходим в папку application->config и открываем файл autoload.php и ищем там строку

$autoload['libraries'] = array();

И пишем вот так:

$autoload['libraries'] = array('database');

И так, теперь давайте в контроллере (если Вы работаете по моим видео-урокам, то это контроллер first) создадим новую функцию и назовем ее articles. В ней загрузим модель, которую мы создали и загрузим вид, например articles_view.php.
Создадим этот вид, в нем мы будем выводить на экран наши записи в цикле.

Вот данная функция в контроллере:

function articles()
{
     $this->load->model('articles_model'); // загрузили модель
     $this->load->view('articles_view');   //загрузили вид
}

А вид, просто пока страничка со стандартным HTML кодом. Когда начнем делать там цикл и выводить на экран записи, я Вам его продемонстрирую.

Теперь переходим в нашу модель (articles_model) и создадим там функцию, которая выберет нашу информацию из БД.

Смотрим:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Articles_model extends CI_Model {

    function get_articles()
    {
        $query = $this->db->get('articles'); // Выбираем всю информацию из таблицы articles
        return $query->result_array();  // возвращаем результат работы нашей функции в виде массива, т.е один
                                        // гигантский массив во всеми нашими данными.
    }

}

Вот и все. Следующий шаг — нам нужно вызвать эту функцию в контроллере, и этот результат работы, который мы вернули в виде массива, поместить в массив data и элемент например article и передать это все в вид.

function articles()
{
     $this->load->model('articles_model'); // загрузка модели
     $data['articles'] = $this->articles_model->get_articles();  // вызываем функцию get_articles и помещаем результат в массив data элемент articles
     $this->load->view('articles_view',$data); // загружаем вид и передаем туда все наши записи из БД
}

Ну и теперь давайте в виде (articles_view) выведем все наши записи на экран в цикле:


<?php foreach($articles as $item):?> // проходимся по массиву articles

<p><?=$item['title'];?></p> // выводим название статьи
<p><?=$item['text'];?></p> // выводим текст статьи
<p><?=$item['date'];?></p> //выводим дату добавления статьи

<?php endforeach;?>

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

function get_articles()
{
    $this->db->limit('4');  // ограничение - выберет только 4 записи из БД
    $this->db->order_by('id','random');  // сортировка в хаотичном порядке
    $this->db->where('id','3');  // условие, выбрать статьи где поле id равно 4
    $query = $this->db->get('articles');
    return $query->result_array();
}

Сортировки бывают — asc, desc, random.

Надеюсь в этом Вы разберетесь. Опять же главное пробовать. Так что, попрактикуйтесь хорошенько 😉

Если урок Вам был полезен, нажмите на любую кнопку ниже— буду благодарен :) Всем удачи и следите за ходом событий ;)

Комменты

  • Александра: 31-03-2015 в 23:38

    надеюсь с третьего раа получится)) после openModal ставлю айди статьи $item[‘id’]

  • Александра: 31-03-2015 в 23:36

    вид некоректно отправился, окно вызываю по ссылке <div id="openModal » class=»modalDialog»>

  • Александра: 31-03-2015 в 23:28

    Доброго времени. Хочу вывести одну запись по id в модальном окне. Окно само простенькое исключительно на css и вызывается по айдишнику <a href="#modaldialog"… Суть проблемы в том, что делаю, вроде, все правильно, но все равно вылетают ошибки:

    1) Severity: Notice
    Message: Undefined variable: news_full
    Filename: views/welcome_view.php
    Line Number: 97

    2)Severity: Warning
    Message: Invalid argument supplied for foreach()
    Filename: views/welcome_view.php
    Line Number: 97

    МОДЕЛЬ:

    function get_news_full($id)
    {
    $this->db->where(«id», $id);
    $query = $this->db->get(‘news’);
    return $query->result_array();
    }

    КОНТРОЛЛЕР:

    function get_news_full($id)
    {
    $this->load->model(‘articles_model’);
    $data[‘news_full’] = $this->articles_model->get_news_full($id);
    }

    ВИД:

    <img src="» class=»articles_img» alt=» «>

    |

    <a href="#openModal» data-id=»» class=»tag»>Читать далее

    <div id="openModal» class=»modalDialog»>

    X

    <img src="» class=»articles_img_new» alt=» «>

    может я ссылку на вызов окна формирую неправильно <a href="#openModal» data-id=»» class=»tag»>Читать далее?

  • Приветствую.
    с CI в первый раз после ЗФ столкнулся. Проблема:

    $this->load->model(‘users_model’);
    var_dump($this->users_model->foo());

    не срабатывает.

    При этом если добавить в автолоад:
    $autoload[‘model’] = array(‘users_model’);
    то var_dump($this->users_model->foo()); в контроллере работает как положено. В чем может быть беда?

  • Дмитрий, добрый день!
    Не пойму в чем проблема. ДБ мускул подпили все нормально, работоспособность модели контроллера вида проверил все гуд, ни ошибок ничего (написал пробный текст в виде ну как в видео, все найс. Однако кусок подключения пхп (ну где мы выводим айтемы нам необходимые) пусто. Иначе говоря загружаю вид, чтобы из БД тупо подгрузил всю инфу (всего 4 строчки 5 колонок) и вывел их даже не в таблицу а просто построчно. Ноль, вообще пусто, страница подгружает все нормально, но инфу не выводит ((( не в курсе в чем трабл?

  • А еще такой вопрос… Почему в контроллере main не загружаются стили в function products()?

  • Не получается( Сделал все как надо, на экран выводит окошко с сообщением:

    A PHP Error was encountered
    Severity: Notice
    Message: Undefined property: Main::$db
    Filename: core/Model.php
    Line Number: 51

    Fatal error: Call to a member function get() on a non-object in

  • И как мне еще сделать вывод строк из БД дополнительно на главной странице, т.е. first.php?

    • Вы так и не ответили) Как сделать, чтобы сразу делать вывод статей на контроллере First, т.е. на главной например?

      • Дмитрий Валак: 19-01-2014 в 23:46

        А какая разница в каком контроллере делать вывод? Работа такая же абсолютно.

  • Вот в моей строчке отображается ссылка на картинку. Скажите пожалуйста, а как мне поместить эту строчку в ??

  • У вас ошибка в файле articles_view: коментарии отображаются на странице))

  • Здравствуйте Дмитрий. http://localhost/CodeIgniter/index.php/First/articles/… я так написала у меня ничего не получается, браузер- пустой…. «Whoops! The page could not be found. Try giving it another chance below.»
    что это значит.. Помогите….

  • Здравствуйте Дмитрий. У меня такая ошибка вроде все сделал как на вашем видео уроке все равно выдает ошибки Unable to connect to your database server using the provided settings.

    Filename: Z:\home\myblog\www\system\database\DB_driver.php

    Line Number: 124

  • Здравствуйте.
    по Codeigniter очень много статей и уроков, мне очень понравились ваши уроки, в них очень доходчиво и понятно все изложено для начинающих.
    Нельзя ли было представить разработку многоуровневого меню для категорий на примере вашего сайта, это было бы интересно многим, в интернете об этом почти ни чего нет я имею в виду Codeigniter.

  • Спасибо, я сам разобрался, хотя может и не правильно. Я сделал вложенный цикл с условием и теперь все подпункты отображаются под соответствующими пунктами. Скажите Дмитрий, правильно ли я поступил, или же нужно было писать код в модели или контроллере?

    • Дмитрий Валак: 12-03-2013 в 9:11

      Здравствуйте.
      Здесь нет, правильно или нет, есть разные способы реализации. Вы реализовали одним из них.

  • Дмитрий, здравствуйте!!!
    Во-первых хочу поблагодарить за очень качественные и понятные уроки по Codeigniter.
    И собственно просьба: не могли бы вы подсказать, как организовать многоуровневое меню?
    Делал немало попыток: делал всевозможные циклы в моделях и в контроллерах — но ничего не получилось. Искал информацию в интернете, но нашел какой-то непонятный для меня код, который в итоге на много больше и сложнее чем тот, который я сделал бы на простом PHP.
    Если вам не трудно подскажите пожалуйста как реализовать, к примеру простое меню с подпунктами… Заранее благодарен за ответ!

  • все правильно сделал но такая ошибка выходит помогите

    Error Number: 1046
    No database selected
    SELECT * FROM (`articles`)
    Filename: C:\xampp\htdocs\CI\system\database\DB_driver.php
    Line Number: 330

  • А можно подобный пример, только работу с формами показать? Простая форма добавления данных в бд: модель, вид, контроллер.

  • Спасибо за помощь

  • Каким образом выводится одна запись из бд по id? Можно пример функций модели, вида и контроллера?

    • Дмитрий Валак: 30-01-2013 в 11:20

      Модель

      public function get_info($id)
      {
      $this->db->where(‘id’,$id);
      $query = $this->db->get(‘news’);
      return $query->row_array();
      }

      Контроллер:

      $data[‘info’] = $this->main_model->get_info($id);
      $this->load->view(‘main_view’,$data);

      Вид

      < ?php echo $info['title'];?>

  • Исправил проблема была и в пользователе поэксперементировал заработало. но текст кракозябрами выводится в базе выставил utf8_general_ci.

    • Дмитрий Валак: 28-10-2012 в 10:36

      Сама кодировка в документе должна быть выставлена utf-8, так же сам файл должен быть в кодировке utf-8. Если работаете в phpdesigner’e то проверить можно перейдя во вкладку File->File Encoding

  • В чём может быть проблема?
    A Database Error Occurred

    Unable to connect to your database server using the provided settings.

    Filename: Y:\home\localhost\www\ci\system\database\DB_driver.php

    Line Number: 124

    • Дмитрий Валак: 28-10-2012 в 9:46

      В папке config есть файл database.php, пропишите там данные для подключения к базе данных.

  • А где должна быть? у меня модель с таким именем расположена по адресу applcation/models
    Вот содержимое:

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
     
    class Articles_model extends CI_Model {  
     
        function get_articles()
        {
            $query = $this->db->get('articles'); // Выбираем всю информацию из таблицы articles
            return $query->result_array();  // возвращаем результат работы нашей функции в виде массива, т.е один
                                            // гигантский массив во всеми нашими данными. 
        }
     
    }

     

    • Дмитрий Валак: 21-10-2012 в 19:00

      Тогда возможно Вы забыли ее подключить.
      Прописали в контроллере — $this->load->model(‘articles_model’); ?

  •  Сделал все один в один — вылетает ошибка:

    A PHP Error was encountered
    Severity: Notice
    Message: Undefined property: First::$articles_model
    Filename: controllers/first.php
    Line Number: 22

    Fatal error: Call to a member function get_articles() on a non-object in Z:\home\ci\CodeIgniter_2.1.3\application\controllers\first.php on line 22

     Подскажите, что это может значить? 

    • Дмитрий Валак: 21-10-2012 в 17:20

      Не правильное название модели. У вас модели articles_model нет.
      И вы пытаетесь с ней работать в контроллере. Вот и получаете ошибку.