Skip to content

Eloquent: Начало работы

1. Введение

Laravel включает в себя Eloquent — объектно-реляционный маппер (ORM), который делает работу с базой данных удобной и приятной. При использовании Eloquent каждая таблица базы данных имеет соответствующую "Модель", которая используется для взаимодействия с этой таблицей. Помимо получения записей из таблицы, модели Eloquent позволяют также вставлять, обновлять и удалять записи.

lightbulb

Перед началом работы убедитесь, что в файле конфигурации вашего приложения config/database.php настроено подключение к базе данных. Для получения дополнительной информации о настройке базы данных ознакомьтесь с документацией по конфигурации базы данных.

1.0.1. Laravel Буткемп

Если вы новичок в Laravel, смело переходите к Laravel Буткемп. Laravel Буткемп проведет вас через создание вашего первого приложения на Laravel с использованием Eloquent. Это отличный способ познакомиться со всеми возможностями Laravel и Eloquent.

2. Генерация классов моделей

Для начала создадим модель Eloquent. Модели обычно находятся в каталоге app\Models и наследуют класс Illuminate\Database\Eloquent\Model. Вы можете использовать команду make:model из Artisan, чтобы создать новую модель:

php artisan make:model Flight

Если вы хотите создать миграцию базы данных вместе с моделью, вы можете использовать опцию --migration или -m:

php artisan make:model Flight --migration

При генерации модели вы можете создать и другие типы классов, такие как фабрики, сидеры, политики, контроллеры и запросы форм. Эти опции можно комбинировать для одновременного создания нескольких классов:

# Создание модели и класса FlightFactory ...
php artisan make:model Flight --factory
php artisan make:model Flight -f
 
# Создание модели и класса FlightSeeder ...
php artisan make:model Flight --seed
php artisan make:model Flight -s
 
# Созддание модели и класса FlightController ...
php artisan make:model Flight --controller
php artisan make:model Flight -c
 
# Generate a model, FlightController resource class, and form request classes...
php artisan make:model Flight --controller --resource --requests
php artisan make:model Flight -crR
 
# Generate a model and a FlightPolicy class...
php artisan make:model Flight --policy
 
# Generate a model and a migration, factory, seeder, and controller...
php artisan make:model Flight -mfsc
 
# Shortcut to generate a model, migration, factory, seeder, policy, controller, and form requests...
php artisan make:model Flight --all
php artisan make:model Flight -a
 
# Generate a pivot model...
php artisan make:model Member --pivot
php artisan make:model Member -p

2.0.1. Анализ моделей

Иногда бывает сложно определить все доступные атрибуты и связи модели, просто просматривая её код. Вместо этого попробуйте команду model:show Artisan, которая предоставляет удобный обзор всех атрибутов и связей модели:

php artisan model:show Flight

3. Соглашения по моделеи Eloquent

10. Области запросов

10.1. Глобальные области

Глобальные области позволяют добавлять ограничения ко всем запросам для данной модели. Собственная функциональность Laravel для мягкого удаления использует глобальные области, чтобы получать из базы данных только "неудаленные" модели. Написание собственных глобальных областей может быть удобным и простым способом обеспечить применение определенных ограничений ко всем запросам для данной модели.

10.1.1. Создание областей

Чтобы создать новую глобальную область, вы можете выполнить Artisan-команду make:scope, которая поместит сгенерированную область в каталог app/Models/Scopes вашего приложения:

php artisan make:scope AncientScope

10.1.2. Написание глобальных областей

Написание глобальной области достаточно просто. Сначала используйте команду make:scope, чтобы сгенерировать класс, реализующий интерфейс Illuminate\Database\Eloquent\Scope. Интерфейс Scope требует реализации одного метода: apply. Метод apply может добавлять ограничения where или другие типы выражений к запросу по мере необходимости:

<?php
 
namespace App\Models\Scopes;
 
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
 
class AncientScope implements Scope
{
/**
* Применение области к заданному конструктору запросов Eloquent..
*/
public function apply(Builder $builder, Model $model): void
{
$builder->where('created_at', '<', now()->subYears(2000));
}
}
lightbulb

Если ваша глобальная область добавляет столбцы в оператор select запроса, следует использовать метод addSelect вместо select. Это предотвратит непреднамеренную замену существующего оператора select запроса.