Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.

Это обзорный урок, который показывает общие концепции присущие ORM. Каждая из этих концепций рассматривается дальше в курсе

ORM (Object-Relation Mapping) – общее название для фреймворков, позволяющих автоматически связать базу данных с кодом. Они стараются скрыть существование базы данных настолько насколько это возможно. Взамен, программисту дают возможность оперировать данными в базе через специальный интерфейс. Вместо построения SQL запросов, программист вызывает простые методы, а всю остальную работу берет на себя ORM.

<?php

$user = new App\User();
$user->name = 'Petr';
$user->save(); // сохранение пользователя в базу

Несмотря на общую цель, ORM бывают очень разными. Eloquent относится к наиболее распространенному и простому типу ORM, реализующему шаблон проектирования ActiveRecord. Этот шаблон базируется на идее, что каждой таблице в приложении соответствует один класс (модель). Этот класс отвечает как за реализацию бизнес логики, так и за взаимодействие с базой данных. Последнее обычно появляется в модели за счет наследования от базового класса ORM.

Модель

<?php

namespace App;
use Illuminate\Database\Eloquent\Model

class Post extends Model
{
    // Благодаря метапрограммированию, модель требует минимум движений для связи с таблицей
    // Даже пустая модель работоспособна. У нее появляются свойства, ее можно загружать из базы и сохранять
}

Каждый объект данного класса соответствует одной записи из этой таблицы. За преобразования данных в объекты и обратно, отвечает ORM. Программисту лишь нужно использовать правильные методы для извлечения объектов и их модификации.

<?php

// Поиск пользователя по идентификатору
$user = App\User::find(1);

// Обновление пользователя
$user->nickname = 'cooler';
// Сохранение в базу
$user->save();

// Удаление записи в базе данных
$user->destroy();

// Общее число пользователей
// SELECT COUNT(*) FROM users;
User::count();

Выборки

Важная часть любой ORM это Query Builder (построитель запросов). Это абстракция поверх SQL, которая упрощает генерацию запросов. Она, обычно, выглядит как цепочка функций, каждая из которых отвечает за конкретную часть SQL, например: ORDER, SELECT или WHERE.

<?php

$users = User::where('state', 'active')
  ->orderBy('name', 'desc')
  ->take(10)
  ->get();

В тех случаях, когда этого языка недостаточно или запрос слишком сложный, ORM позволяет выполнять запросы напрямую:

<?php 

// Такой запрос нужно делать через билдер, но для демонстрации можно и так
$users = DB::select('select * from users where active = ?', [1]);

Схема

Еще одна обязанность ORM – изменение схемы базы данных: добавление, удаление и модификация таблиц. Делается это, как правило не на чистом SQL, а с помощью специального языка. Это позволяет работать с ORM не отвлекаясь на особенности конкретных баз данных. ORM сама создает правильный SQL подходящий под конкретную базу данных:

<?php

Capsule::schema()->create('users', function ($table) {
    $table->bigIncrements('id');
    $table->string('email')->unique();
    $table->string('first_name');
    $table->string('password');
    $table->string('last_name');
    $table->timestamps();
});

В Eloquent используется подход "база первая". Это значит, что для создания новых моделей или изменения поведения старых, нужно сначала изменить базу данных.

Миграции

Любая база данных в процессе жизни приложения изменяется. В нее добавляются новые таблицы, удаляются старые, какие-то меняются. Этот процесс никогда не заканчивается. Изменения в базе данных выполняются с помощью механизма миграций. Миграция это, обычно, файл, который содержит SQL, меняющий текущую схему базы данных.

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateArticlesTable extends Migration
{
    // Выполнится при накатывании
    public function up()
    {
        Schema::create('articles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->text('body');
            $table->timestamps();
        });
    }

    // Выполнится при откатывании
    public function down()
    {
        Schema::dropIfExists('articles');
    }
}

Когда этот файл создан, то происходит процесс, который называют "накаткой миграций" (обычно говорят "я накатил миграции"). Он выполняется с помощью утилиты командной строки. В Laravel это выглядит так:

$ php artisan migrate

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

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →