Это обзорный урок, который показывает общие концепции присущие ORM. Каждая из этих концепций рассматривается дальше в курсе
ORM (Object-Relation Mapping) – общее название для фреймворков, позволяющих автоматически связать базу данных с кодом. Они стараются скрыть существование базы данных настолько, насколько это возможно. Взамен, программисту дают возможность оперировать данными в базе через специальный интерфейс. Вместо построения SQL-запросов, программист вызывает простые методы, а всю остальную работу берёт на себя ORM.
<?php
$user = new App\Models\User();
$user->name = 'Petr';
$user->save(); // сохранение пользователя в базу
Несмотря на общую цель, ORM бывают очень разными. Eloquent относится к наиболее распространённому и простому типу ORM, реализующему шаблон проектирования Active Record. Этот шаблон базируется на идее, что каждой таблице в приложении соответствует один класс (модель). Этот класс отвечает как за реализацию бизнес логики, так и за взаимодействие с базой данных. Последнее обычно появляется в модели за счёт наследования от базового класса ORM.
Кроме Active Record существует шаблон Data Mapper, он например, реализован в Doctrine. Этот подход разделяет сущности и код, связанный с базой данных, на два независимых слоя. Такой подход гибче, но при этом сложнее в работе.
Модель
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
// Благодаря метапрограммированию, модель требует минимум движений для связи с таблицей
// Даже пустая модель работоспособна.
// У неё появляются свойства, её можно загружать из базы и сохранять
}
Каждый объект данного класса соответствует одной записи из этой таблицы. За преобразования данных в объекты и обратно, отвечает ORM. Программисту лишь нужно использовать правильные методы для извлечения объектов и их модификации.
<?php
// Поиск пользователя по идентификатору
$user = App\Models\User::find(1);
// Обновление пользователя
$user->nickname = 'cooler';
// Сохранение в базу
$user->save();
// Удаление записи в базе данных
$user->destroy();
// Общее число пользователей
// SELECT COUNT(*) FROM users;
App\Models\User::count();
Выборки
Важная часть любой ORM — это Query Builder (построитель запросов). Это абстракция поверх SQL, которая упрощает генерацию запросов. Она обычно выглядит как цепочка функций, каждая из которых отвечает за конкретную часть SQL, например: ORDER, SELECT или WHERE.
<?php
$users = App\Models\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 это класс, который необходимо использовать в Eloquent
// при использовании вне Laravel. Подробнее в документации.
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 используется подход Database First. Это значит, что для создания новых моделей или изменения поведения старых, нужно сначала изменить базу данных, а ORM сама подхватывает изменения и работает с ними. Например, для добавления нового свойства достаточно добавить новую колонку. В коде ничего менять не нужно, она автоматически начинает работать.
В некоторых ORM встречается подход Code First. В таком случае изменения делаются не в базе, а в коде. А дальше ORM сама формирует необходимые изменения для базы данных, подстраивая ее под код
Миграции
Любая база данных в процессе жизни приложения изменяется. В неё добавляются новые таблицы, удаляются старые, какие-то меняются. Этот процесс никогда не заканчивается. Изменения в базе данных выполняются с помощью механизма миграций. Миграция это, обычно, файл, который содержит 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
В процессе выполнения этой команды, автоматически проверяются, какие миграции были уже применены, а какие — нет. Применяются только те миграции, которые еще не выполнены на текущей базе данных.
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.