为Laravel 5.5中的所有模型创建自定义查询构建器方法(查询范围)

nor*_*orr 2 scope laravel laravel-5.5

我有多个带有时间戳的模型。我经常使用whereDate获取今天和昨天的所有行,如下所示:

ModelName::whereDate('created_at', now()->today())->get();
ModelName::whereDate('created_at', now()->yesterday())->get();
Run Code Online (Sandbox Code Playgroud)

我想让它更短,更简单,例如:

ModelName::today()->get();
ModelName::yesterday()->get();
Run Code Online (Sandbox Code Playgroud)

我找不到执行此操作的任何方法,因此我在文档中发现可以创建自己的“作用域”。问题是,我可以为指定的模型制作模型,但是找不到为所有模型全局制作模型的方法。现在,我需要将此作用域方法粘贴到每个模型类中。这行得通,但是我需要在每个模型类中重复此代码,所以我确定这不是一个好方法。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class ModelName extends Model
{


    /**
     * Custom scope (query builder method) to easy return all items from today
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeToday($query)
    {
        return $query->whereDate('created_at', now()->today());
    }


    /**
     * Custom scope (query builder method) to easy return all items from yesterday
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeYesterday($query)
    {
        return $query->whereDate('created_at', now()->yesterday());
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nin 5

您可以在特征中定义本地范围

<?php
namespace App\Traits;

trait Scopes
{
    public function scopeToday($query)
    {
        return $query->whereDate('created_at', now()->today());
    }

    public function scopeYesterday($query)
    {
        return $query->whereDate('created_at', now()->yesterday());
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您喜欢的任何模型中使用特征:

use App\Traits\Scopes;
Run Code Online (Sandbox Code Playgroud)

并使用特征:

ModelName::today()->get();
ModelName::yesterday()->get();
Run Code Online (Sandbox Code Playgroud)

做到这一点的另一种方法是创建和扩展基础模型类,并在那里定义范围,但我将使用特征。