Зарегистрируйтесь, чтобы продолжить обучение

Модель PHP: Eloquent (ORM)

Модель — это воплощение понятия предметной области в коде приложения. В Eloquent каждая модель представлена классом в коде и таблицей в базе данных:

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
}
  1. Модель = Класс только в классовых языках. Чисто технически она может быть чем угодно, это зависит от языка.
  2. Связь Модель-Таблица — это особенность паттерна Active Record. В другом подходе, называемом Data Mapper, всё может быть по-другому.

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

# Laravel
php artisan make:model User

В нашем же случае используется файл src/schema.php, в котором есть определение таблицы:

<?php

Capsule::schema()->create('users', function ($table) {
    $table->id();
    $table->string('email')->unique(); // уникальный индекс
    $table->string('first_name')->nullable(); // может быть пустым
    $table->string('last_name')->nullable(); // может быть пустым
    $table->string('password')->nullable();
    $table->timestamps();
});

Этого описания достаточно для начала работы. Теперь можно создавать сущности, сохранять их в базу и обновлять:

<?php

$user = new App\Models\User();
// Кажется, что это свойство, но на самом деле это магический метод __set
$user->email = 'user@email.com';
// Такое именование не соответствует стандарту PSR12, но таковы стандарты Eloquent
$user->first_name = 'Pedro';
$user->last_name = 'Rodriges';
// Пароли нельзя хранить в открытом виде
$user->password = password_hash('rasmuslerdorf', PASSWORD_DEFAULT);

$user->save(); // INSERT (добавление новой записи)

$user->email = 'pedro@hotmail.com';
$user->save(); // UPDATE (обновление существующей записи)

// Выводит содержимое объекта
print_r($user->toArray());
// [
//    "email" => "pedro@hotmail.com",
//    "first_name" => "Pedro",
//    "last_name" => "Rodriges",
//    "password" => "$2y$10$jpJD6FlPp0bQFXF3rxFUTu6p.wxnbuxRE803cTdfeqAsqEtJbikp.",
//    "updated_at" => "2019-08-23 02:33:50",
//    "created_at" => "2019-08-23 02:33:34",
//    "id" => 1,
//  ]

$user->destroy(1); // удаление пользователя, передаём id в метод destroy()

Этот код работает благодаря подходу "соглашения вместо конфигурации" (Convention Over Configuration). Нам не пришлось явно указывать имя таблицы, с которой связана модель. Eloquent автоматически получила её имя, выполнив приведение имени класса к нижнему регистру и сделав его во множественном числе.

Кроме того, Eloquent проанализировала структуру этой таблицы для определения первичного ключа, полей и их типов. Эта информация используется внутри модели для сохранения, обновления и загрузки данных в код. Из примера выше видно, что при создании или обновлении сущности, используется метод save(), а Eloquent сама распознает что сейчас происходит: создание или обновление.

После того как сущность сохранена в базу, её можно извлечь. Самый простой способ сделать это, воспользоваться статическим методом find($id). Он выполняет поиск по первичному ключу.

<?php

// Предположим, что запись с таким идентификатором есть в базе данных
$user = App\Models\User::find(1);

// Если записи не существует, то вернётся null
App\Models\User::find(100);

Самостоятельная работа

  1. Зайдите в REPL набрав make console.
  2. Создайте нескольких пользователей, обновите их.
  3. Переоткройте REPL и извлеките сущности из базы данных.
  4. Удалить часть сущностей.

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»