Отношения загрузки по умолчанию в Laravel: подробное руководство

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

Метод 1. Использование метода withDefault
Метод withDefaultпозволяет указать связи, которые должны загружаться по умолчанию без промедления. Давайте рассмотрим пример, где у нас есть модель User, которая имеет отношение один-ко-многим с моделью Post.

use Illuminate\Database\Eloquent\Model;
class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }

    public function withDefault()
    {
        return $this->with('posts');
    }
}

Теперь всякий раз, когда вы получаете модель User, связанная с ней связь postsбудет быстро загружаться по умолчанию.

Метод 2. Использование глобальных областей
Глобальные области позволяют применять ограничения запросов ко всем запросам для данной модели. По умолчанию мы можем использовать глобальную область видимости для быстрой загрузки отношений.

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use App\Scopes\DefaultRelationshipsScope;
class User extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope(new DefaultRelationshipsScope);
    }
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

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

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class DefaultRelationshipsScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->with('posts');
    }
}

Метод 3: переопределение метода newQuery
Вы можете переопределить метод newQueryв своей модели, чтобы всегда по умолчанию загружать определенные связи.

use Illuminate\Database\Eloquent\Model;
class User extends Model
{
    protected function newQuery()
    {
        return parent::newQuery()->with('posts');
    }
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}

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