Laravel: 具有特征的范围方法

Laravel: scope method with traits

!有一个名为 ModelScrops 的特征,其中我有一些与模型相关联的常用方法。我最近了解了 scope 功能。所以,我正在尝试实施它,但出现此错误:

Call to undefined method Illuminate\Database\Query\Builder::addedBy()

这是我的代码:

...

trait ModelScrops
{
    ...

    public function scopeAddedBy($query)
    {
        return $query->select([
            \DB::raw("(
                CASE `{$this->table}`.`employable_type`
                    WHEN 'C' THEN `companies`.`name`
                    ELSE CONCAT(`employees`.`name`, ' [ ', `employees`.`code`,  ' ]')
                END
            ) AS `added_by`")
        ]);
    }

    ...
}

型号:

use App\Traits\ModelScrops;

...

class Device extends Model
{
    use ModelScrops;

    ...

    public function show($token)
    {
         return \DB::table($this->table)
            ->where("{$this->table}.token", $token)

            ...

            ->addedBy()
            ->get() ?? null;
    }
}

我什至尝试将 scopeAddedBy 方法放入 Device 模型中,但错误是相同的。

范围用于 Eloquent 模型而不是直接与查询生成器一起使用。您正在直接使用查询生成器进行查询:DB::table(...)。您想使用您的模型构建此查询,您将有权访问您的范围。

return static::where('token', $token)
    ...
    ->addedBy()
    ->get();

甚至:

return $this->newQuery()->where(...)->.....;

旁注:get总是returns一个集合。