拉拉维尔:具有特征的范围方法



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

Call to undefined method IlluminateDatabaseQueryBuilder::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 AppTraitsModelScrops;
...
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总是返回一个集合。

最新更新