Laravel,在另一个 class 中创建本地作用域

Laravel, create local scope in another class

我有一个模型任务;我想创建一些本地范围;我们可以创建它:

public function scopeIstasked($query){
  return $query;
}

但我想在另一个文件上创建它作为服务,因为也许我可以以如此大的范围结束,以至于我的模型不再可读

所以我创建 TaskScopeService.php

class TaskScopeService {
    public function showConcerned($query){
        $query = $query->whereHas('organisations.organisateur', function($query){
            $query->where('customers.id', Auth::id());
        });

        return $query;
    }

    public function showToFromAll($query){
        $query = $query->where(function($query){
            $query->where('porter', 'close')->whereHas('customer', function($query){
                $query->isfriend();
            })->whereDoesntHave('group');
        });

        return $query;
    }
}

我想将这些功能合并到我的模型中,可以用作作用域行为;我只是使用简单的方法在我的模型构造函数中调用 class 并在范围函数中使用它们但是我在我的模型中以如此多的范围函数结束作为我不想要的情况

在特征中声明方法

trait TaskScopeService {
    public function scopeConcerned($query){
        $query = $query->whereHas('organisations.organisateur', function($query){
            $query->where('customers.id', Auth::id());
        });

        return $query;
    }

    public function scopeToFromAll($query){
        $query = $query->where(function($query){
            $query->where('porter', 'close')->whereHas('customer', function($query){
                $query->isfriend();
            })->whereDoesntHave('group');
        });

        return $query;
    }
}

然后在class任务中使用它

class Task extends Model 
{
    use TaskScopeService;
//...
}

要使用名称以 scope 开头的作用域函数,请执行以下操作:

Task::concerned()->get();
//or combine them
Task::toFromAll()->concerned()->get();

编辑

要使 scopeConcerned() 独立于您的会话(并且不在其中使用 Auth::id()),请使用参数声明它。

public function scopeConcerned($query, $customerId){
    $query = $query->whereHas('organisations.organisateur', function($query) use($customerId) {
        $query->where('customers.id', $customerId);
    });

    return $query;
}

并像这样使用它

Task::concerned(Auth::id())->get();

你可以使用 Mixins

namespace App\Mixins;

use Illuminate\Database\Eloquent\Builder;

class BuilderMixins
{
    public function pagination()
    {
        return function ($limit) {
            if (!is_null($limit)) {
                if ($limit === '0') {
                    return Builder::get();
                }

                return Builder::limit($limit)->get();
            }

            return Builder::paginate(config('constants.per_page'));
        };
    }
}

我用这个方法作为范围。我建议你观看 https://www.youtube.com/watch?v=S8nz1JqbT9M