Laravel — это простой в использовании PHP-фреймворк с открытым исходным кодом. Одной из его наиболее мощных функций является Eloquent, объектно-реляционный преобразователь (ORM), который упрощает обработку записей в базе данных.

Выразительная скорость создания, чтения, обновления и удаления операций с базой данных из приложения. При использовании Eloquent вы создаете модели, зеркально отображающие таблицы базы данных, и используете эти модели для создания запросов.

В этой статье рассматриваются шесть элементов наиболее мощной функциональности Eloquent: области запросов, отношения, мутаторы и средства доступа, коллекции, удаление моделей и фабрики. В нем рассказывается о том, что делает каждая функция, на практических примерах. Мы надеемся, что вы сможете использовать эти примеры, чтобы начать свое мастерство в Laravel Eloquent.

1. Красноречивые области запроса

При создании приложения вы иногда сталкиваетесь с ситуациями, когда условия используются более одного раза. Переписывание кода в каждом случае может увеличить вероятность ошибок и сделать ваш код неопрятным. Laravel решает эту проблему, заключая такие условия в многократно используемые операторы, называемые областями действия.

Области запросов — это методы добавления логики базы данных в модель и повторного использования логики запроса.

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

$onGoing = Project::where('ongoing', 1)->get();

Это условие может понадобиться вам на других страницах приложения, например на странице статистики. Области запроса позволяют странице повторно использовать приведенное выше условие, упрощая ваш запрос и делая ваш код чище.

Вот как вы можете использовать область запроса для этого сценария:

class Features extends Model
{
    public function scopeOngoing($query)
    {
        return $query->where('ongoing', 0);
    }
}

Затем используйте приведенный ниже код для выполнения этой области:

$onGoing = Feature::ongoing()->get();

Существует два типа областей: глобальные и локальные.

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

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

Локальные области

Локальные области позволяют определять общие ограничения для повторного использования. Например, вы можете захотеть, чтобы приложение возвращало функции, в которых есть ошибки. Ваш код может реализовать локальную область следующим образом:

namespace AppModels;
use IlluminateDatabaseEloquentModel;

class User extends Model
{
    public function scopeBugged($query)
    {
        return $query->where('bugged', '>', 1);
    }
}

Приведенный выше код возвращает все функции, в которых есть неисправленные ошибки.

2. Красноречивые отношения

Отношения в Eloquent позволяют легко связывать разные таблицы. Например, продукт на веб-сайте электронной коммерции может содержать список ассортимента, цены, просмотров и отзывов. С помощью Eloquent вы можете легко управлять этими отношениями, даже если их записи находятся в разных таблицах.

Вы можете определять отношения как методы классов модели, как и в модели Eloquent. Некоторые часто используемые отношения Eloquent включают отношения «один к одному», обратные и полиморфные.

Один к одному

Вот пример базового отношения «один к одному», которое связывает модель продукта со запасами.

public function Inventory()
{
    return $this->hasOne('AppInventory');
}

В приведенном выше коде Inventory() метод вызывает hasOne() метод на модели продукта. Это проверяет, доступен ли продукт в данный момент.

Обратный

Eloquent также позволяет создавать обратные отношения. Например, если вы хотите получать товары на основе количества их просмотров. Обратные отношения могут дать вам продукты, которые вызывают наибольший интерес у посетителей веб-сайта. Вы можете использовать belongsTo() метод, который является обратным hasOne(). Код ниже иллюстрирует это.

public function product()
{
    return $this->belongsTo('AppProduct');
}

В приведенном выше коде Eloquent соответствует product_id к количеству просмотров. product_id затем может помочь получить другие параметры, такие как цена и запасы.

Полиморфный

В разработке приложений отношения не всегда просты. Иногда у вас есть модель, принадлежащая более чем одному типу модели. Например, модели продуктов и запасов могут иметь полиморфные отношения с моделью изображения.

Полиморфные отношения позволят вам использовать один и тот же список изображений как для инвентаря, так и для продуктов. Ниже приведен фрагмент кода, реализующий полиморфные отношения.

class Image extends Model
{
    /**
     * Getting the shared image.
     */
    public function myimage()
    {
        return $this->morphTo();
    }
}

class Product extends Model
{
    /**
     * Get the image to use on the product's page.
     */
    public function image()
    {
        return $this->morphOne(Image::class, 'myimage');
    }
}

class Inventory extends Model
{
    /**
     * Get the image to use on the inventory page.
     */
    public function image()
    {
        return $this->morphOne(Image::class, 'myimage');
    }
}

В приведенном выше коде используется morphTo() метод для получения родительского объекта полиморфной модели.

Это лишь верхушка айсберга в этой теме. Дополнительную информацию см. в нашем расширенном руководстве по взаимоотношениям в Laravel Eloquent.

3. Красноречивые мутаторы и средства доступа

Мутаторы и средства доступа позволяют изменять данные при их хранении и извлечении. Мутаторы изменяют данные перед их сохранением, а средства доступа изменяют данные при их получении.

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

Ниже приведен пример мутатора, который пишет имена с заглавной буквы перед их сохранением.

class User extends Model
{
    /**
     * Mutators capitalizing first and last name.
     */
    public function setFirstNameAttribute($value)
    {
        $this->attributes['first_name'] = ucfirst($value);
    }

    public function setLastNameAttribute($value)
    {
        $this->attributes['last_name'] = ucfirst($value);
    }
}

Ниже приведен пример средства доступа, объединяющего имя и фамилию пользователя.

class User extends Model
{
    /**
     * Accessor combining both names.
     */
    public function getFullNameAttribute()
    {
        return ucfirst($this->first_name) . ' ' . ucfirst($this->last_name);
    }
}

4. Красноречивые коллекции

Коллекции Eloquent обрабатывают методы, которые возвращают несколько результатов модели. Этот класс находится в IlluminateDatabaseEloquentCollection.

Как и в случае с массивами, коллекции можно перебирать. Ниже приведена простая итерация.

use AppModelsProduct;

$products = Product::where('availability', 1)->get();

foreach ($products as $product) {
   echo $product->name;
}

Коллекции более эффективны, чем массивы, поскольку с ними можно выполнять более сложные операции. Например, вы можете отобразить список всех доступных продуктов и пропустить все, что не «активно».

$names = Product::all()->reject(function ($product) {
   return $product->active === false;
})->map(function ($product) {
   return $product->name;
});

Ниже приведены некоторые методы, предоставляемые классом коллекций.

Содержит

contains() Метод проверяет, содержит ли код указанный режим, как показано в коде ниже:

$products->contains(1);
$products->contains(Product::find(1));

Все

all() Метод возвращает модели, содержащиеся в коллекции, как показано ниже:

$collection = Product::all();

Класс коллекций поддерживает множество других методов.

5. Удалить модели Eloquent

В Eloquent вы создаете модели, помогающие создавать запросы. Однако иногда вам необходимо удалить модели, чтобы сделать приложение более эффективным. Для этого позвоните delete на экземпляре модели.

use AppModelsStock;

$stock = Stock::find(1);
$stock->delete();

Приведенный выше код удаляет модель Stock из приложения. Это окончательное удаление, которое невозможно отменить.

Мягкое удаление

Еще одна функция, которую содержит Eloquent, — это возможность мягкого удаления модели. При мягком удалении модели вы не удаляете ее из базы данных.

Вы отмечаете это, используя deleted_at для указания времени и даты обратимого удаления. Это важно, если вы хотите исключить часть записей базы данных, например неполные, без их окончательного удаления. Это помогает очистить результаты запросов Eloquent без добавления дополнительных условий.

Вы включаете обратимое удаление, добавляя softDeletes черта модели и добавление deleted_at столбец в связанной таблице базы данных.

Добавление обратимого удаления в модель

Вы включаете обратимое удаление модели, добавляя IlluminateDatabaseEloquentSoftDeletes черта, как показано ниже.

namespace AppModels;
use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Flight extends Model
{
   use SoftDeletes;
}

Как добавить столбец delete_at

Прежде чем вы сможете начать использовать обратимое удаление, в вашей базе данных должен быть delete_at столбец. Вы добавляете этот столбец с помощью Laravel Schema вспомогательный метод строителя, как показано ниже:

use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

Schema::table('users', function (Blueprint $table) {
   $table->softDeletes();
});

Schema::table('users', function (Blueprint $table) {
   $table->dropSoftDeletes();
});

Это добавляет delete_at столбец, который обновляется с указанием даты и времени в случае успешного обратимого удаления.

Как включить обратимо удаленные модели

Если вы хотите, чтобы результаты запроса включали обратимо удаляемые модели, добавьте withTrashed() метод запроса. Пример показан ниже:

$stocks = Stock::withTrashed()->where('stock_id', 20)->get();

В приведенный выше запрос также будут включены модели с deleted_at атрибут.

Как получить только обратимо удаленные модели

Eloquent также позволяет извлекать исключительно модели с обратимым удалением. Вы можете сделать это, позвонив в onlyTrashed() метод, например:

$Stock = Stock::onlyTrashed()->where('stock_id', 1)->get();

Как восстановить обратимо удаленные модели

Вы также можете восстановить обратимо удаленные модели, вызвав restore() метод.

$stocks = Stock::withTrashed()->where('stock_id', 20)->restore();

Это меняет delete_at поле обратимо удаленной модели обнулить. Если модель не была обратимо удалена, поле останется без изменений.

6. Красноречивые фабрики

Фабрики моделей в Laravel создают фиктивные данные, которые вы можете использовать для тестирования своего приложения или для заполнения базы данных. Чтобы реализовать это, вы создаете модель в фабричном классе, как показано в примере ниже. Фрагмент кода создает модельную фабрику, которая может генерировать поддельных поставщиков продукта и его цены.

namespace DatabaseFactories;
use IlluminateDatabaseEloquentFactoriesFactory;
use IlluminateSupportStr;

class StockFactory extends Factory
{
    public function definition()
    {
        return [
            'supplier_name' => fake()->name(),
            'price' => fake()->numberBetween($min = 1500, $max = 6000),
        ];
    }
}

definition() Метод в приведенном выше примере возвращает набор значений атрибутов, которые Laravel использует при построении модели. Фальшивый помощник помогает фабрике получить доступ к библиотеке PHP Faker.

Краткое содержание

Eloquent упрощает задачи разработки приложений в Laravel. Он одинаково эффективен при построении простых и сложных запросов благодаря таким реализациям, как отношения. Простота генерации функциональных фиктивных данных с использованием фабрик делает их идеальными для разработчиков, которые хотят создавать надежные тесты для своих приложений. Кроме того, области Eloquent помогают упростить сложные запросы, сохраняя порядок в коде.

Хотя в этой статье рассмотрены только шесть основных функций, у Eloquent есть и другие мощные функции. Использование общих и повторно используемых моделей сделало Eloquent популярной функцией среди разработчиков, а простота запросов Eloquent делает Laravel удобной средой для разработчиков — даже для новичков.

Независимо от вашего уровня опыта, платформа хостинга веб-приложений Kinsta поддерживает таких разработчиков, как вы. Наш шаблон быстрого запуска Laravel показывает, насколько легко запустить ваше приложение на наших серверах в сети премиум-уровня Google Cloud.