Создаем первую Модель

Комментарии: 44  Просмотры: 32 598

Если вы выполнили все действия, описанные в предыдущем уроке, то теперь самое время познакомится с тем, как происходит работа с Базой Данных в Кохане. Поскольку мы сейчас создаем что-то вроде блога, то для примера создадим несколько пробных статей и выведем их на главной странице.
Таблица у нас будет пока упрощенная и состоять она будет из Идентификатора статьи, автора, даты публикации и соответственно самой статьи в виде превью (для вывода на главной странице).

CREATE TABLE IF NOT EXISTS `articles` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор статьи',
  `title` varchar(250) NOT NULL COMMENT 'Название статьи',
  `author` varchar(100) NOT NULL COMMENT 'Автор статьи',
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Дата публикации',
  `content_short` text NOT NULL COMMENT 'Текст статьи',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Теперь заполним таблицу данными, чтобы было с чем работать:

INSERT INTO `articles` (`id`, `title`, `author`, `date`, `content_short`) VALUES
(1, 'О фреймворках', 'Петя Иванов', '2012-04-01 17:20:33', 'Фреймворк - в информационных
системах структура программной системы; программное обеспечение, облегчающее разработку
и объединение разных компонентов большого программного проекта. В отличие от библиотек,
которые объединяют набор подпрограмм близкой функциональности, фреймворк содержит в себе
большое количество разных по назначению библиотек.'),
(2, 'Фреймворк Yii', 'Вася Петров', '2012-04-01 17:20:33', 'Yii - это высокопроизводительный
веб-фреймворк, написанный на PHP, и реализующий парадигму MVC. Yii — аббревиатура, которая
расшифровывается как "Yes It Is!"'),
(3, 'Фреймворк Symfony', 'Гриша Сидоров', '2012-04-01 17:23:29', 'Symfony — свободный каркас,
написанный на PHP5, который использует паттерн Model-View-Controller.\r\nSymfony предлагает
быструю разработку и управление веб-приложениями, позволяет легко решать рутинные задачи
веб-программиста. Работает только с PHP 5. Имеет поддержку множества баз данных. Информация
о реляционной базе данных в проекте должна быть связана с объектной моделью. Это можно
сделать при помощи ORM инструмента. Symfony поставляется с двумя из них: Propel и Doctrine.');

Подготовительные работы закончены и пришла наконец пора создать Модель, которая будет работать с этими данными. Для этого создайте в application/classes/model файл под названием article.php со следующим содержимым:

<?php defined('SYSPATH') or die('No direct script access.');
 
class Model_Article extends Model
{
    protected $_tableArticles = 'articles';
 
    /**
     * Get all articles
     * @return array
     */
    public function get_all()
    {
        $sql = "SELECT * FROM ". $this->_tableArticles;
 
        return DB::query(Database::SELECT, $sql)
                   ->execute();
    }
}

Мы видим, что наш класс Model_Article наследует другой класс под названием Model. В начале класса мы сразу указываем, с какой таблицей будем работать, чтобы в случае изменения ее названия можно было поменять его только в одном месте. Метод get_all получает все записи из таблицы articles. Для этого внутри метода написан обычный sql-запрос, присвоен переменной и передан в метод query. Этот метод принимает следующие параметры: тип запроса в виде константы (это может быть Database::SELECT, Database::INSERT, Database::UPDATE и Database::DELETE), сам запрос, выбор вывода результата — в виде массива или объекта (по умолчанию стоит FALSE — выводить как массив) и массив с параметрами, используемыми в запросе. Ну и для выполнения запроса и получения результатов нужно в конце выполнить метод execute.
Теперь нужно изменить наш контроллер Page и обратиться в нем к свежесозданной модели. Класс контроллера будет выглядеть вот так:

<?php defined('SYSPATH') or die('No direct script access.');
 
class Controller_Page extends Controller_Common {
 
    // Главная страница
    public function action_index()
    {
        $articles = array();
 
        $content = View::factory('/pages/show')
                ->bind('articles', $articles);
 
        $article = new Model_Article();
        $articles = $article->get_all();
 
        $this->template->content = $content;
    }
 
} // End Page

В нем мы создаем объект класса Model_Article и вызываем его единственный метод get_all.
Можно использовать метод Фабрика и заменить эти две строки на одну (этот вариант кстати предпочтительнее):

$articles = Model::factory('Article')->get_all();

Полученный массив значений передается в блок контента посредством метода bind

А файл Вида show.php, где храниться выводимый на главной контент, станет таким:

<h3>Это главная страница</h3>
<br />
 
<?php foreach($articles as $article): ?>
 
    <div style="padding:10px; margin-bottom:10px; border-bottom:#333 2px solid;">
        <strong><?php echo $article['title']; ?></strong><br />
        <i>Автор: <?php echo $article['author']; ?></i> / 
        <i>Дата публикации: <?php echo $article['date']; ?></i><br /><br />
        <p><?php echo $article['content_short']; ?></p>
    </div>
 
<?php endforeach; ?>

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

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

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 44 коммент.

Накопилась куча моделей. Можно ли их как-то по папкам раскидать?

Пробовал так — ORM::factory(‘ПАПКА/МОДЕЛЬ’), но не заработало.

Специально зарегистрировался чтобы спросить.

Я много движков смотрел и мне всегда было не понятно: зачем использовать конструкцию:
Database::SELECT, Database::INSERT, Database::UPDATE и Database::DELETE

Почему не вставлять просто SELECT, INSERT, UPDATE, DELETE?

Вызов статических методов класса Database. Что не так-то ?

Присоединяюсь к вопросу. для чего вообще оно надо?
вот кусочек моего кода

return DB::query(Database::SELECT, ‘SELECT * FROM table1′)->execute();

я не пойму для чего там пишется «Database::SELECT»

Ведь по запросу моему «SELECT * FROM table1″ и так понятно что это SELECT. Подскажите, зачем это надо «Database::SELECT»?

Хочется писать программу и понимать что я применяю, а не писать тупо, именно так, потому что так все пишут и так написано в инструкции.

Спасибо доброму человеку за будущий ответ. Я только начал кохану изучать, поэтому Вам может показаться что мой вопрос тупой)).

В контролере, не понял строчку:
$this->template->content = $content;
заработало после замены на:
echo $content->render();

У меня почему то $this->template->content = $content; не работало. Выскакивала ошибка:
ErrorException [ Notice ]: Undefined variable: articles

Заменил на $this->template->articles = $articles; и всё включилось.

Почему не работал $this->template->content = $content; ?

Спасибо за труды Ваши уроки очень помогают.
Хотя иногда — очень часто и приходится долго думать — почему не работает? (уровень знаний небольшой)

Ничего лучше Вашего сайта в сети не встретил.

Скажите пожалуйста, можно как-нибудь использовать во View метод из Model’и?

Тоже самое для PostgreSQL:
CREATE TABLE if NOT EXISTS articles (
«id» serial NOT NULL,
«title» varchar(250) NOT NULL ,
«author» varchar(100) NOT NULL ,
«date» timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
«content_short» text NOT NULL ,
primary key («id»)
);

INSERT INTO articles (id, title, author, date, content_short) VALUES
(1, ‘О фреймворках’, ‘Петя Иванов’, ’2012-04-01 17:20:33′, ‘Фреймворк — в информационных
системах структура программной системы; программное обеспечение, облегчающее разработку
и объединение разных компонентов большого программного проекта. В отличие от библиотек,
которые объединяют набор подпрограмм близкой функциональности, фреймворк содержит в себе
большое количество разных по назначению библиотек.’),
(2, ‘Фреймворк Yii’, ‘Вася Петров’, ’2012-04-01 17:20:33′, ‘Yii — это высокопроизводительный
веб-фреймворк, написанный на PHP, и реализующий парадигму MVC. Yii — аббревиатура, которая
расшифровывается как «Yes It Is!»‘),
(3, ‘Фреймворк Symfony’, ‘Гриша Сидоров’, ’2012-04-01 17:23:29′, ‘Symfony — свободный каркас,
написанный на PHP5, который использует паттерн Model-View-Controller.\r\nSymfony предлагает
быструю разработку и управление веб-приложениями, позволяет легко решать рутинные задачи
веб-программиста. Работает только с PHP 5. Имеет поддержку множества баз данных. Информация
о реляционной базе данных в проекте должна быть связана с объектной моделью. Это можно
сделать при помощи ORM инструмента. Symfony поставляется с двумя из них: Propel и Doctrine.’);

Все сделала, как было сказано, но выдает ошибку Database_Exception [ 1044 ]: Access denied for user »@’localhost’ to database ‘kohana’, в чем проблема?

Данные для подключения к базе видимо неверно прописаны.

http://kohanaframework.su/database/db_config

Database_Exception [ 2 ]: mysql_connect() [function.mysql-connect]: Access denied for user »@’localhost’ (using password: NO)

MODPATH\database\classes\Kohana\Database\MySQL.php [ 67 ]

62 catch (Exception $e)
63 {
64 // No connection exists
65 $this->_connection = NULL;
66
67 throw new Database_Exception(‘:error’,
68 array(‘:error’ => $e->getMessage()),
69 $e->getCode());
70 }
71
72 // \xFF is a better delimiter, but the PHP driver uses underscore

Создал в БД таблицу со строкой «user», которая имеет «id», «username», «password». И вот при авторизации этого юзера вылетает такая ошибка…
Заранее спасибо.

Подскажите пожалуйста зачем нужно объявлять переменную
$articles = array();
Она ведь вроде ни где не используется. Если ее убрать ни чего не меняется. Спасибо



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.