Как подружить фреймворк Laravel c MongoDb?

Как подружить фреймворк Laravel c MongoDb?

От автора: так сложилось, что современные тенденции веб-разработки направлены на тотальное усложнение интернет-проектов. Сейчас уже не встретить сайт, на котором представлены страницы с простой текстовой информацией. Вместо того мы наблюдаем сложнейшие интернет порталы, которые манипулируют огромнейшим количеством все возможной информации, как текстовой, так и мультимедийной. И я сейчас не говорю о визуальной составляющей и обилия всевозможных скриптов, которые выполняются на клиентской стороне.

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

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

Поэтому сейчас все чаще, мы с Вами, встречаем такие слова как оптимизация, кеширование и не реляционные базы данных или же No SQL. Причем последние по сравнению с реляционными базами данных работают несколько быстрее и обладают хорошей масштабируемостью. Поэтому в текущем уроке, мы с Вами поговорим о том, как же подружить один из лидирующих фреймворков в данное время Laravel, с ярким представителем баз NoSql – Mongo DB.

Кратко хотел бы отметить что MongoDB — документо-ориентированная система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц и как Вы уже догадались, относится она к NoSQL базам данных, а так же использует JSON-подобные документы и схему базы данных. Собственно, что касается теории, то в этом уроке мы будем заниматься только практикой и подробно останавливаться на основах по работе с СУБД MongoDB не будем, так как это не тема данного урока, да и для этого, нужен полноценный миникурс.

Итак, для работы, конечно же, нам потребуется установленная система управления базами данных. Я использую на локальном компьютере сборку OpenServer, а значит, указанная СУБД уже установлена и готова к работе. Так же нам понадобится установленный фреймворк Laravel и для наглядности я установил инструмент MongoDB Compass, который очень удобен для работы с MongoDb.

Как подружить фреймворк Laravel c 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 

После выполнения команды, мы увидим, что в базе данных были созданы необходимые документы.

Как подружить фреймворк Laravel c MongoDb?

Собственно теперь мы можем работать с базой данных, используя привычные, нам методы по выборке и добавлению данных. Однако для этого все классы моделей, которые Вы используете, должны наследоваться от специального класса 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); 

При этом результат будет следующим:

Как подружить фреймворк Laravel c MongoDb?

Вот собственно и все что я хотел сказать в этом уроке, поэтому если расширение и собственно база данных MongoDB Вас заинтересовала – практикуйтесь, набирайтесь опыта, так как это направление довольно перспективное. Всего Вам доброго и удачного кодирования!!!