有没有一种方法可以自动将限制应用于模型?

时间:2019-01-17 14:52:00

标签: laravel model eloquent

我的场景

我有一个具有数百万行的数据库。我只想随时返回最多500个字。我知道我可以在使用Eloquent时在查询中使用-> take(500)来做到这一点。但是,如果我忘记添加此怎么办?

这可能会导致数据库长时间运行查询,从而导致前端应用程序用户的性能出现问题。

我想要的东西

我希望有一种方法可以向模型中添加选项,以便每当使用该选项运行查询时,都会自动限制返回500行。

我希望有一种类似于protected $table = 'something';的东西可以用来附加到所有口才查询。

1 个答案:

答案 0 :(得分:2)

您可以对其应用global scope

例如,您将创建一个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);
    }
}