【问题标题】:Is there a way to automatically apply a limit to a model?有没有办法自动对模型应用限制?
【发布时间】:2019-01-17 14:51:59
【问题描述】:

我的场景

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

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

我想要什么

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

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

【问题讨论】:

    标签: laravel model eloquent


    【解决方案1】:

    您可以对其应用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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多