Есть ли способ автоматически применить ограничение к модели? - PullRequest
0 голосов
/ 17 января 2019

Мой сценарий

У меня есть БД с миллионами строк. Я хочу вернуть максимум 500 в любое время. Я знаю, что могу сделать это с помощью -> take (500) для запроса при использовании Eloquent. Однако, что если я забуду добавить это?

Это может привести к тому, что БД будет долго выполнять запрос, что приведет к проблемам с производительностью для пользователей интерфейсного приложения.

Что бы я хотел

Я хотел бы, чтобы был способ добавить опцию в модель, чтобы при каждом выполнении запроса с его помощью автоматически возвращалось ограничение в 500 строк.

Я надеюсь, что есть что-то похожее на protected $table = 'something';, которое можно использовать для добавления ко всем запросам Eloquent.

1 Ответ

0 голосов
/ 17 января 2019

Вы можете применить к нему глобальную область действия .

Например, вы должны создать LimitScope следующим образом:

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class LimitScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        $builder->take(500);
    }
}

, а затем примените его к вашей модели.

<?php

namespace App;

use App\Scopes\LimitScope;
use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new LimitScope);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...