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

时间:2018-02-11 13:41:33

标签: laravel scope laravel-5.5

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

ModelName::today()->get();
ModelName::yesterday()->get();

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

<?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());
    }
}

我找不到任何方法来做到这一点,所以我在文档中发现我可以制作自己的&#34;范围&#34;。问题是,我可以为指定的模型制作它,但我无法找到一种方法来为所有模型全局制作它。现在我需要在每个模型类中粘贴这个范围方法。这是有效的,但我需要在每个模型类中重复这个代码,所以这不是一个很好的方法,我确定。

myFunctionToSetState = (propertyName) => {

    //I want to use the string I pass as the key in my new object
    this.setState({ propertyName: newValue});
}

//I'm calling the function like this
this.myFunctionToSetState('myPropertKey');

1 个答案:

答案 0 :(得分:4)

您可以在特征中定义local scopes

mav.addObject("lRetailers",lRetailers);

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

<?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());
    }
}

并使用特征:

use App\Traits\Scopes;

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