Модель — это воплощение понятия предметной области в коде приложения. В Eloquent каждая модель представлена классом в коде и таблицей в базе данных:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
}
- Модель = Класс только в классовых языках. Чисто технически она может быть чем угодно, это зависит от языка.
- Связь Модель-Таблица — это особенность паттерна 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);
Самостоятельная работа
- Зайдите в REPL набрав
make console
. - Создайте нескольких пользователей, обновите их.
- Переоткройте REPL и извлеките сущности из базы данных.
- Удалить часть сущностей.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.