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

<?php
namespace App;

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->bigIncrements('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\User();
// Кажется, что это свойство, но на самом деле это магический метод __set
$user->email = '[email protected]';
// Такое именование не соответствует стандарту PSR12, но таковы стандарты Eloquent
$user->first_name = 'Pedro';
$user->last_name = 'Rodriges';
// Пароли нельзя хранить в открытом виде
$user->password = password_hash('rasmuslerdorf', PASSWORD_DEFAULT);

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

$user->email = '[email protected]';
$user->save(); // UPDATE (обновление существующей записи)

// Выводит содержимое объекта
print_r($user->toArray());
// [
//    "email" => "[email protected]",
//    "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->delete(); // удаление пользователя

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

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

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

<?php

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

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

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

  1. Зайдите в REPL набрав make console.
  2. Создайте нескольких пользователей, обновите их.
  3. Переоткройте REPL и извлеките сущности из базы данных.
  4. Удалить часть сущностей.
Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

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