Laravel 5.3范围回报

时间:2016-10-27 09:17:11

标签: laravel scope

我的产品型号

中存在此范围问题

我的范围如下:

public function scopeLessNinetyDays( $query ){

    $date = new \Carbon\Carbon;
    $date->subWeek(12); 

    return $query->where('created_at', '<', $date->toDateTimeString())->get() ;
}

我尝试将其循环到类别中,结果位于底部。我需要返回真或假。如果产品created_at已经在12周内了。这很奇怪,因为它返回了集合。而不是单一的产品。

 @foreach( $category->product->take(4) as $product )
       {{ dd($product->lessNinetyDays()) }}
    @endforeach

enter image description here

如果我使用此代码,则返回单个产品。见底部的图片。

@foreach( $category->product->take(4) as $product )
   {{ dd($product) }}
@endforeach

enter image description here

由于结果,我不知道如何实现这一目标。

3 个答案:

答案 0 :(得分:1)

您错误地使用本地范围。从数据库中选择行时,只使用与定义范围匹配的行。

你在寻找什么,就像一个假的属性&#34; (访问者),这可能是实现您所希望的最雄辩的方式。

首先,定义这个访问者:

public function getIsLessNinetyDaysAttribute() {
  $date = (new \Carbon\Carbon)->subWeek(12);

  return $this->created_at->lt($date);
}

现在,您可以使用以下方法访问此属性:

@foreach( $category->product->take(4) as $product )
   {{ dd($product->is_less_ninety_days) }}
@endforeach

这应返回 true false

使用本地范围的示例

定义此范围后:

public function scopeLessNinetyDays( $query ){

  $date = new \Carbon\Carbon;
  $date->subWeek(12); 

  return $query->where('created_at', '<', $date->toDateTimeString())->get();
}

现在,您可以将此范围链接到选择查询:

@foreach( $category->product->lessNinetyDays()->get() as $product )
   {{ dd($product) }}
@endforeach

在这个foreach循环中,返回的唯一行是与lessNinetyDays范围匹配的行。

有多种方法可以实现您的目标,但在这种情况下,我总是更喜欢使用访问者。

答案 1 :(得分:0)

范围用于查询选择。见Local Scopes

如果您只是将以下内容添加到模型中,那么它应该返回true或false。

public function lessNinetyDays()
{
    $date = new \Carbon\Carbon;
    $date->subWeek(12);

    return $this->created_at > $date;
}

答案 2 :(得分:0)

您使用的范围不正确。

它不应该返回任何内容 - 它只应该修改查询,它不应该返回任何内容,尤其是查询的结果。因此,您应该替换

return $query->where('created_at', '<', $date->toDateTimeString())->get() ;

$query->where('created_at', '<', $date->toDateTimeString());

然后,如果您要获取在过去90天内创建的产品,则需要执行以下操作:

$products->lessNinetyDays()->get();

在此处查看更多信息:https://laravel.com/docs/5.3/eloquent#local-scopes