Главная » Статьи » Использование ORM библиотеки Eloquent без фреймворка Laravel

Использование ORM библиотеки Eloquent без фреймворка Laravel

Использование ORM библиотеки Eloquent без фреймворка Laravel

От автора: сейчас трудно себе представить сайт, который в своей работе не использует базу данных, ну разве, что это сайт типа Landing Page, то есть одностраничный сайт. Порой на сайтах подобного рода, присутствуют различные формы, которые как раз используются для сохранения определенной информации в базу данных.

скачать исходники

Таким образом, при создании очередного проекта, так или иначе, разработчику, приходится писать код, который будет взаимодействовать с требуемой СУБД. А так как сейчас очень популярны фреймворки и программисты в виду своей занятости, пытаются уменьшить количество набираемого кода, то достаточно большую популярность набирают различные инструменты по объектно-реляционному отображению баз данных. При этом, как Вы знаете, они же идут в комплекте практически в каждом PHP фреймворке. Но что делать, если пишется некий проект с нуля, без использования фреймворка.

В этом случае всегда можно подыскать и использовать отдельную ORM библиотеку, благо их сейчас очень много, или же можно ту, которая содержится в том фреймворке, что Вам знаком. И поэтому в этом уроке я хотел бы показать Вам, как можно использовать библиотеку ORM Eloquent, которая входит в комплектацию Laravel, отдельно от самого фреймворка.

Итак, для начала давайте перейдем по ссылке и рассмотрим страницу проекта на сервисе GitHub. Собственно в описании как раз приводится краткий пример использования библиотеки в пользовательском проекте. Вот как раз его мы и возьмем за основу.

Теперь давайте установим, интересующую нас библиотеку на тестовый проект. Для этого будем использовать инструмент Composer, а значит, в корневой директории создадим файл composer.json следующего содержания.

{ "name":"example ORM", "description":"---", "type":"project", "require": { "illuminate/database": "5.1.8" }, "autoload": { "psr-4" : { "Controllers\\": "app/controllers/", "Models\\": "app/models/" } }
}

Используемые свойства:

name – имя Вашего проекта;

description – краткое описание;

type – тип проекта;

require – перечень пакетов, которые необходимо загрузить;

autoload – список используемых пространств имен и путей к ним.

Теперь открываем консоль и в директории проекта выполняем команду composer update, тем самым Вы скачаете все пакеты, указанные в секции require и зависимости к ним.

Собственно установка завершена, и можно приступать к работе. Так как библиотека будет работать с базой данных, значит нужно определить настройки подключения. Для этого создадим в корневой директории файл config.php, и добавим в него следующий код (по сути константы с параметрами подключения):

<?php
defined("DBDRIVER")or define("DBDRIVER","mysql");
defined("DBHOST")or define("DBHOST","localhost");
defined("DBNAME")or define("DBNAME","eloquent");
defined("DBUSER")or define("DBUSER","root");
defined("DBPASS")or define("DBPASS","");

Далее создадим каталог app и в нем еще две директории controllers и models, в которых будут хранится контроллеры и модели соответственно. Таким образом, как Вы догадались, тестовое приложение будет построено по паттерну проектирования MVC.
Далее в каталоге app/models создадим файл Database.php, в котором опишем код по подключению ORM Eloquent к базе данных.

<?php
namespace Models;
use Illuminate\Database\Capsule\Manager as Capsule;
class Database { function __construct() { $capsule = new Capsule; $capsule->addConnection([ "driver" => DBDRIVER, "host" => DBHOST, "database" => DBNAME, "username" => DBUSER, "password" => DBPASS, "charset" => "utf8", "collation" => "utf8_unicode_ci", "prefix" => "", ]); $capsule->bootEloquent(); }
}

Обратите внимание, что обязательно необходимо определять пространство имен. Для подключения к базе данных мы используем менеджер под названием Capsule (так же не забываем прописать необходимое пространство имен), а значит, в конструкторе создаваемого класса создаем его объект. Затем вызываем на исполнение метод addConnection(), то есть добавляем новое подключение и в качестве первого аргумента, передаем массив с настройками подключения. Ну и завершающая строка кода, это вызов метода bootEloquent(), то есть загрузка библиотеки с новым подключением.

Теперь, давайте создадим файл index.php – это точка входа в наше приложение:

<?php
require "config.php";
require "vendor/autoload.php";
use Models\Database; $dt = new Database();

Как Вы видите, все достаточно просто – подключаем файл конфигурации, файл autoload.php, который был сгенерирован инструментом composer и создаем объект класса Database, который мы как раз с Вами определили.

Собственно теперь можно приступать к созданию моделей. Поэтому в каталоге app/models, создаем файл User.php, со следующим кодом:

<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model;
class User extends Model { protected $table = "users"; protected $fillable = array("name"); public function articles() { return $this->hasMany('\Models\Article'); }
}

По сути, для тех, кто знаком с фреймворком Laravel, указанный код, будет знаком. Но, а для тех кто не знает, немного поясню. Собственно мы с Вами описали класс модели, которая является объектно-ориентированным отображением реальной таблицы users в базе данных. Конечно, данное отображение виртуально и не особо наглядное, так как здесь мы не видим полей таблицы, но по большому счету это и не нужно, потому как данная модель в полной мере будет взаимодействовать с базой данных и указанной таблицей. Обратите внимание, что в свойстве $table определено имя таблицы, а в свойстве $ fillable в виде массива, представлен список, тех полей, которые разрешены к сохранению. Что же касается добавленного метода articles() – то это описание отношения (один ко многим) между моделями – текущей и моделью Article ,которую мы еще с Вами создадим.

При этом я подробно не останавливаюсь, на теме создания моделей, так как одного урока для этого просто не хватит. Данная тема в полной мере освещена в нашем курсе по фреймворку Laravel.

Аналогично создаем модель Article:

<?php
namespace Models;
use \Illuminate\Database\Eloquent\Model; class Article extends Model { protected $table = "articles"; protected $fillable = array("title",'user_id');
}

Хотел бы отметить, что каждой модели соответствует реальная таблица в базе данных. То есть таблицы users и articles.

Итак, на данном этапе у нас есть две модели, а значит пришло время создать контроллеры, которые будут взаимодействовать с ними. Поэтому в каталоге app/controllers создаем файл Users.php, со следующим содержимым.

<?php
namespace Controllers;
use Models\User;
class Users { public static function create_user ($name) { $arr = array( "name" => $name ); $user = User::create($arr); return $user; } public static function show_users () { //$users = User::all(); $users = User::with('articles')->get(); return $users; }
} 

Как обычно в файле обязательно нужно определить пространство имен. Далее подключаем пространство имен модели User, потому как контроллер будет взаимодействовать с ней. Ну а дальше описываем методы, необходимые по функционалу разрабатываемого приложения. К примеру, я добавил два метода create_user() и show_users – по созданию новой записи в таблице users и отображению на экран всех добавленных пользователей, соответственно.

Для создания новой записи в базе данных, можно использовать метод create(), модели, при этом в качестве первого аргумента передается массив – пары, ключ-значение, со списком сохраняемых полей и их значений. Для получения все записей из таблицы, используются методы all() или get().

Точно так же создаем контроллер Articles:

<?php namespace Controllers;
use Models\Article; class Articles { public static function create_article ($title, $user_id) { $arr = array( "title" => $title, 'user_id' => $user_id ); $article = Article::create($arr); return $article; } }

Ну и как же все это использовать, спросите Вы. Собственно давайте несколько изменим код файла index.php, для создания новых записей в таблицах users и articles. Ну и конечно выведем что-то на экран.

<?php
require "config.php";
require "vendor/autoload.php";
use Models\Database;
use Controllers\Users;
use Controllers\Articles;
$dt = new Database();
$user = Users::create_user("Bob");
$users = Users::show_users(); $article = Articles::create_article("title", 1); foreach($users as $user) { echo $user->name."<br>"; foreach($user->articles as $article) { echo $article->title.'<br>'; }
}

Как Вы видите, первая часть кода осталась без изменений. Далее подключены пространства имен, только что созданных контроллеров и так как в них описаны только статические методы, то нет надобности в создании их объектов. Соответственно мы вправе просто вызвать необходимый у соответствующего класса, что как раз я и делаю. То есть для создания нового пользователя, вызываем метод create_user() и в качестве первого аргумента передаем его имя. Далее осуществляем выборку всех добавленных пользователей, используя метод контроллера show_users(), которые выводим на экран ниже, при помощи цикла foreach(). При этом так как, у каждого пользователя есть связанная модель Article, нам понадобится второй вложенный цикл, при помощи которого мы обойдем все статьи конкретного пользователя и выведем их на экран. Статьи, то есть записи таблицы articles, добавляются аналогично, так что думаю, комментарии излишни.

Собственно на этом все. Указанный подход и библиотека используются во фреймворке Laravel и теперь Вы можете использовать их отдельно для своих пользовательских приложений PHP. Всего Вам доброго и удачного кодирования!!!