Создание приложения на Kohana.Работа с базой данных. Часть 3

Ромчик
4

Роуты в kohana

Доброго времени суток. Мы продолжаем создавать приложение при помощи фреймворка kohana. И сегодня мы остановимся на работе с базой данных. Подключим модуль kohana для работы с базой данных, настроим этот модуль, научимся создавать запросы при помощи query builder.

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

Подключение и настройка модуля database

Как Вы уже знаете, подключение модулей в kohana осуществляется в файле bootstrap.php. Давайте зайдем в этот файл и раскомментируем строку:
‘database’   => MODPATH.’database’,   // Database access
Отлично модуль для работы с базой данных мы подключили. Давайте настроим его.
Файлы настроек модулей находятся в корне проекта в папке modules в данной папке есть подпапки с названиями соответствующим названиям модулей, а уже в них находиться директория config, в которой находятся файлы конфигурации соответствующих модулей. Так, например, файл конфигурации database.php модул database находится в ./modules/database/config/ Давайте скопируем этот файл в папку ./application/config/. Для чего это надо? Как я уже говорил в первых статьях, что kohana построена таким образом, что все приложение находиться в папке application и все изменения необходимо делать именно там и не в коем случае не трогать системные файлы, которые находятся вне директории application. Это нужно соблюдать, если конечно Вы не хотите получить проблем, например, при обновлении kohana.
Давайте рассмотрим конфигурационный файл модуля database.
Данный файл состоит из массива с данными, где элементы массива это названия профилей для подключения к базе данных, а аргументы — это опции подключения. По умолчанию данный массив состоит из двух элементов default и alternate. Так, как у нас одна база данных, то мы и будем рассматривать только профиль default. Но если же, вам необходимо осуществлять доступ к нескольким базам данных, то Вы можете настроить различные профили по аналогии с default профилем.

'default' => array
 (
 'type'       => 'mysql',
 'connection' => array(
 'hostname'   => 'localhost',
 'database'   => 'kohana',
 'username'   => FALSE,
 'password'   => FALSE,
 'persistent' => FALSE,
 ),
 'table_prefix' => '',
 'charset'      => 'utf8',
 'caching'      => FALSE,
 'profiling'    => TRUE,
 ),

, где:

  • type — тип базы данных, в нашем случае MySQL
  • connection — это массив параметров подключения: hostname — адрес сервера базы данных, database — название базы данных, username — логин для подключения к базе данных, если нет, то ставим FALSE, password — пароль, persistent — использование постоянного подключения
  • table_prefix — префикс таблицы, по умолчанию нет
  • charset — кодировка базы данных, по умолчанию UTF8
  • caching — кеширование
  • profiling — профилирование

Давайте введем необходимые нам настройки. У меня для данного приложения создана база данных book, пользователей данной базы book и пароль book. Тогда изменим настройки модуля database следующим образом:

'default' => array
 (
 'type'       => 'mysql',
 'connection' => array(
 'hostname'   => 'localhost',
 'database'   => 'book',
 'username'   => 'book',
 'password'   => 'book',
 'persistent' => FALSE,
 ),
 'table_prefix' => '',
 'charset'      => 'utf8',
 'caching'      => FALSE,
 'profiling'    => TRUE,
 ),

Отлично, теперь сохраним внесенные изменения. На этом подключение и настройка модуля для работы kohana с базой данных завершена.
Давайте создадим в нашей базе таблицу books c полями:

  • id
  • title — название книги
  • description — описание книнги
  • id_author — id автора, для простоты пока будем считать, что у книги есть только один автор.
  • id_genre — id жанра книги, для простоты будем считать, что книга соответствует одному жанру
  • date — дата добавления книги

Создадим таблицу genres с полями:

  • id
  • genre — жанр

И создадим таблицу authors:

  • id
  • name — имя автора

Добавим данные в эти таблицы, вы можете скачать отсюда sql файл c этими таблицами и заполненными данными.
Давайте сделаем так, чтобы на главной странице выводился список всех книг.

Создание модели в kohana

Cоздадим модель books. В прошлом посту мы уже создавали модель. В папке ./application/classes/models создаем файл books.php следующего содержания:

<?php

defined('SYSPATH') or die('No direct script access.');

class Model_Books extends Model {

    public function all_books() {
        $query = DB::query(Database::SELECT, 'SELECT * FROM books');
        $books = $query->execute();
        return $books;
    }

}

Давайте немного поясним, что мы сделали. Мы создали класс Books, который унаследовал все свойства и методы от класса Model. В классе books мы создали метод all_books, кторый возвращает массив значений $books, а эти значения данный метод берет из таблицы books путем выполнения запроса “SELECT * FROM books”.
Давайте остановимся на рассмотрении выполнения запросов.
Т.е. если мы хотим выбрать из таблицы данные, то должны действовать по следующему механизму:

        $query = DB::query(Database::SELECT, 'SELECT * FROM books');
        $books = $query->execute();

,где в первой строке мы задаем запрос, причем данная конструкция позволяет защититься нам от SQL-инъекций, а уже во второй строке мы при помощи метода execute выполняем запрос. Причем тут следует уточнить, что метод execute может принимать параметр, который отвечает за использование профиля для подключения к базе данных (которые мы описывали в начале данной статьи в bootstrap.php), по умолчанию используется профиль default. Так, с этим разобрались.
Теперь нам необходимо сделать выборку из таблицы по каким-то критериям. Как это организовать? А очень просто.

        $query = DB::query(Database::SELECT, 'SELECT * FROM books WHERE id=:id');
        $query->param(‘:id’, <значение>);
        $books = $query->execute();

Тут понятно, что в строке $query->param(‘:id’, <значение>); мы передаем значение переменной :id.
А если нам надо передать несколько параметров? Да, можно использовать предыдущую конструкция для передачи значений переменной несколько раз. Но это не удобно и не эстетично. И в этом случае лучше использовать следующую конструкцию:

        $query = DB::query(Database::SELECT, 'SELECT * FROM books WHERE id=:id' AND date=:date);
        $query->parameters(array(
                                          ‘:id’=><значение>,
                                          ‘:date’=><значение>,
                                       ));
        $books = $query->execute();

Т.е. значения переменным мы передаем в массиве.
Но есть еще один очень удобный способ передачи значений переменым:

$query = DB::query(Database::SELECT, 'SELECT * FROM books WHERE id=:id')->bind(‘:id’,<значение>);

или для передачи нескольким переменным значений

$query = DB::query(Database::SELECT, 'SELECT * FROM books WHERE id=:id' AND date=:date)->bind(‘:id’,<значение>)->bind(‘:date’,<значение>);

Для выполнения запросов добавления, удаления или изменения данных используются следующие конструкции, соответственно:

  • Database::INSERT
  • Database::DELETE
  • Database::UPDATE

Мы с Вами разобрали как выполнять запросы в Kohana. И как Вы видите данные конструкции громоздки и неудобны. Поэтому в Kohana их используют редко. А для выполнения простых запросов используют технологию Query Builder и ORM. О ORM мы поговорим в следующей статье, а сегодня рассмотрим построение запросов при помощи Query Builder

Построение запросов Query Builder

Построение запросов при помощи Query Builder намного удобней и красивей, чем при использовании прямых запросов. Давайте рассмотрим выборку из таблицы. Допустим мы хотим выполнить следующий запрос:

SELECT * FROM ‘table’

Построение данного запроса при помощи Query Builder будет выглядеть следующим образом:

DB::select()
    ->from(‘table’);

Как может показаться на первый взгляд, что запрос построенный при помощи Query Builder выглядит сложнее, но при дальнейшем использовании (когда привыкните) Вы поймете, что Query Builder намного удобнее при построении более сложных запросов.
Теперь мы хотим выполнить следующий запрос:

SELECT `name`, `date` FROM `table` WHERE `name` LIKE jonh

В Query Builder будет выглядеть следующим образом:

DB::select(`name`, `date`)
    ->from(`table`)
    ->where(`name`, `=`, `jonh`)

where принимает три значения:

  • название поля
  • условие
  • значение

Так, например мы можем записать where(`name`, `IN`, array(`roma`, `sasha`, `anton`)), что будет означать, что в поле name должно быть одно из значений массива, т.е. или roma, или sasha, или anton.
Или можем записать where (`date`, `BETWEEN`, array(`date`,`now`)), т.е. в поле date должна находиться дата между датой date и текущей датой.
Теперь давайте выполним следующий запрос:

SELECT * FROM `table` LIMIT (10) OFFSET (30)

В Query Builder данный запрос будет выглядеть следующим образом:

DB::select()
   ->from(`table`)
   ->limit(10)
   ->offset(30)

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

SELECT * FROM `table` ORDER BY `name` DESC

В Query Builder данный запрос будет выглядеть следующим образом:

DB::select()
   ->from(`table`)
   ->order_by(`name`, `DESC`);

Давайте рассмотрим вставку данных с помощью QueryBuilder. Так например давайте выполним следующий запрос:

INSERT INTO `table` (`name`, `date`) VALUES (`имя`, `дата`)

В Query Builder данный запрос будет выглядеть следующим образом:

DB::insert(`table`, array(`name`, `date`))
    ->values(array(`имя`, `дата`));

Как видите не сложно и достаточно удобно. В метод insert класса DB мы передаем первый параметр название таблицы, а вторым массив, в котором перечисляем список полей куда будем добавлять данные. А уже values передаем в виде массива значения.
По аналогии происходит и обновления данных в таблице:

DB::update(`table`)
    ->set(array(`name` => `roma`))
    ->where (`name`, `=`, `anton`);

Удаление. Удаление данных ни чуть не сложней, чем выше перечисленные действия.

DB::delete(`table`)
    ->where(`name`, `=`, `roma`);

Т.е. удаляем из таблицы table строку поле name, которой равно roma.
JOIN. Давайте рассмотрим запрос с JOIN.

DB::select (books.title, author.name)
    ->from(books)
    ->join(author)
    ->on(books.author_id, `=`, `author.id`);

Вот в принципе и все основные приемы работы с Query Builder. Да и с базами данных в Kohana. В одной из статей я подробно расскажу о построении запросов с помощью Query Builder. А на этом данный пост я заканчиваю.
А в следующем посте мы остановимся на ORM: разберемся, что такое ORM и научимся с ним работать. Так, что не пропускайте выхода новых постов, подписавшись на получение извещений о новых постах на Ваш почтовый ящик или подписывайтесь на RSS рассылку.

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger

  • Julia22 - 16.08.2012 в 21:29

    Как же вывести на страницу результаты запроса? Массивом? Жду с нетерпением продолжения уроков по созданию приложения.

    • Roman - 17.08.2012 в 16:10

       Все будет, времени не было, теперь постараюсь наверстать упущенное

  • Виктор Виру - 13.03.2013 в 19:40

    Очень хорошие уроки. Отличное объяснение, у вас получается. Продолжайте пожалуйста. Сейчас на Kohana большой спрос.

  • azion - 26.04.2014 в 11:17

    вопрос есть ссылка на видео из базы данных add_video а как вывести это видео в
    чтобы ссыла подставлялась в iframe и показывалось видео

    делаю так <iframe width="420" height="315" src=" » frameborder=»0″ allowfullscreen>
    что делаю не так подскажите

  • ©2012-2017 По всем вопросам обращайтесь через форму обратной связи

    Яндекс.Метрика