Php 基于BelongsTo关系的Laravel范围

Php 基于BelongsTo关系的Laravel范围,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我有两个模型,一个是属于服务类型的服务实例。服务类型决定了一些事情,其中包括服务长度 在ServiceInstances中,我试图实现这个“伪”逻辑: 我需要获取$this->serviceType()->长度,但关系方法失败 public function scopeExpired($query) { $length = $query->serviceType()->length; return $query->where('created_at', '<

我有两个模型,一个是属于服务类型的
服务实例
。服务类型决定了一些事情,其中包括服务
长度

ServiceInstances
中,我试图实现这个“伪”逻辑:

我需要获取$this->serviceType()->长度,但关系方法失败

public function scopeExpired($query) {
    $length = $query->serviceType()->length;
    return $query->where('created_at', '<', Carbon::now()->subDays($length));
}
公共函数作用域已过期($query){
$length=$query->serviceType()->length;

return$query->where('created_at'),调用
$query->serviceType()
返回关系对象,而
$query->serviceType
返回模型本身。现在它检索一个模型,但当您有一个一个或多个关系时,它返回一个模型数组

正确的方法是调用不带括号的
serviceType
,如下所示

public function scopeExpired($query) {
    $length = $query->serviceType->length;
    return $query->where('created_at', '<', Carbon::now()-    >subDays($length));
}
公共函数作用域已过期($query){
$length=$query->serviceType->length;

return$query->where('created_at',”您不应该在范围内执行查询。您可以用纯SQL完成同样的任务。试试看

public function scopeExpired($query) {
    return $query
        ->join('services', 'services.type_id', '=', 'service_types.id')
        ->whereRaw('TO_DAYS(created_at) < DATE_SUB(NOW()) - service_types.length');
}
公共函数作用域已过期($query){
返回$query
->join('services','services.type_id','=','service_types.id'))
->whereRaw('TO_DAYS(created_at)
可能是“$this->serviceType->length”-没有括号,如果没有成功-我得到的只是另一个错误:
[ErrorException]未定义的属性:Octory\Rain\Database\Builder::$serviceType
作用域应该修改查询而不是执行查询。您可能希望在服务类型表上执行联接,并使用SQL而不是PHP进行长度比较。尝试了但未成功-我得到的是另一个错误:
[ErrorException]未定义的属性:十月\Rain\Database\Builder::$serviceType