От автора: так сложилось, что современные тенденции веб-разработки направлены на тотальное усложнение интернет-проектов. Сейчас уже не встретить сайт, на котором представлены страницы с простой текстовой информацией. Вместо того мы наблюдаем сложнейшие интернет порталы, которые манипулируют огромнейшим количеством все возможной информации, как текстовой, так и мультимедийной. И я сейчас не говорю о визуальной составляющей и обилия всевозможных скриптов, которые выполняются на клиентской стороне.
Все это приводит к тому, что помимо основного функционала, при разработке, довольно остро стоит вопрос быстродействия проекта, ведь современные фреймворки и CMS в виду своей тотальной универсальности довольно требовательны к серверу и не так уж и быстры.
Поэтому сейчас все чаще, мы с Вами, встречаем такие слова как оптимизация, кеширование и не реляционные базы данных или же No SQL. Причем последние по сравнению с реляционными базами данных работают несколько быстрее и обладают хорошей масштабируемостью. Поэтому в текущем уроке, мы с Вами поговорим о том, как же подружить один из лидирующих фреймворков в данное время Laravel, с ярким представителем баз NoSql – Mongo DB.
Кратко хотел бы отметить что MongoDB — документо-ориентированная система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц и как Вы уже догадались, относится она к NoSQL базам данных, а так же использует JSON-подобные документы и схему базы данных. Собственно, что касается теории, то в этом уроке мы будем заниматься только практикой и подробно останавливаться на основах по работе с СУБД MongoDB не будем, так как это не тема данного урока, да и для этого, нужен полноценный миникурс.
Итак, для работы, конечно же, нам потребуется установленная система управления базами данных. Я использую на локальном компьютере сборку OpenServer, а значит, указанная СУБД уже установлена и готова к работе. Так же нам понадобится установленный фреймворк Laravel и для наглядности я установил инструмент MongoDB Compass, который очень удобен для работы с MongoDb.
Фреймворк Laravel, из “коробки” не поддерживает работу с указанной базой данных, а значит, нам потребуется дополнительное расширение, благодаря которому, мы сможем работать с ней, используя стандартные средства фреймворка. Поэтому по ссылке, Вы как раз найдете подходящий пакет, а значит, используя консоль и находясь в папке фреймворка, вводим следующую команду для установки расширения:
composer require jenssegers/mongodb
Затем, в файл config/app.php, добавляем сервис провайдер, установленного расширения:
Jenssegers\Mongodb\MongodbServiceProvider::class,
Далее необходимо настроить подключение к базе данных, потому как по умолчанию используется mysql, поэтому в файл config/database.php, добавляем следующие строки кода:
'mongodb' => [ 'driver' => 'mongodb', 'host' => env('DB_HOST', 'localhost'), 'port' => env('DB_PORT', 27017), 'database' => env('DB_DATABASE'), 'username' => env('DB_USERNAME'), 'password' => env('DB_PASSWORD'), 'options' => [ 'database' => 'admin' // sets the authentication database required by mongo 3 ] ],
И наконец, в файл локальной конфигурации .env, внесем следующие изменения.
DB_CONNECTION=mongodb DB_HOST=localhost DB_PORT=27017 DB_DATABASE=tlaravel #DB_USERNAME=homestead #DB_PASSWORD=secret
Теперь настройка полностью завершена, а значит для проверки, давайте применим доступные миграции, тем самым убедимся, что расширение успешно работает.
php artisan migrate
После выполнения команды, мы увидим, что в базе данных были созданы необходимые документы.
Собственно теперь мы можем работать с базой данных, используя привычные, нам методы по выборке и добавлению данных. Однако для этого все классы моделей, которые Вы используете, должны наследоваться от специального класса use Jenssegers\Mongodb\Eloquent\Model. К примеру, вот таким образом:
<?php namespace App; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Article extends Eloquent { // protected $collection = 'articles'; protected $fillable = ['title','text']; }
Так же обратите внимание, что в свойстве $collection, Вы можете определять документ, с которым будет работать конкретная модель. Теперь для начала, давайте добавим некоторую информацию в базу данных:
Article::create([ 'title' => 'Hello', 'text' => 'world', ]);
Для выборки данных можем использовать одно из выражений:
$articles = Article::all(); $article = Article::find('5a9c3278dc8c6c0ffc000d93'); $articles = Article::where('_id','5a9c3278dc8c6c0ffc000d93')->orWhere('_id','5a9c32abdc8c6c0ffc000d94')->get();
Точно так же как и в реляционных базах данных, Вы можете формировать связи между моделями, используя все те же методы:
<?php namespace App; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Article extends Eloquent { // protected $collection = 'articles'; protected $fillable = ['title','text']; public function category() { return $this->belongsTo('App\Category'); } }
И точно так же для модели Category:
<?php namespace App; use Jenssegers\Mongodb\Eloquent\Model as Eloquent; class Category extends Eloquent { // protected $collection = 'category'; protected $fillable = ['title']; public function articles() { return $this->hasMany('App\Article'); } }
Таким образом, можно создать одну категорию.
Category::create( [ 'title' => 'JS', ]
И добавить в нее одну статью, как связующий документ.
$article = new Article(['title' => 'A Game of Thrones','text'=>'hello']); $category = Category::first(); $book = $category->articles()->save($article);
Ну и, конечно же, выбрать записи в зависимости от наличия связанных записей можно следующим образом:
$article = Article::whereHas('category')->get(); dump($article);
При этом результат будет следующим:
Вот собственно и все что я хотел сказать в этом уроке, поэтому если расширение и собственно база данных MongoDB Вас заинтересовала – практикуйтесь, набирайтесь опыта, так как это направление довольно перспективное. Всего Вам доброго и удачного кодирования!!!