我的产品型号
中存在此范围问题我的范围如下:
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
如果我使用此代码,则返回单个产品。见底部的图片。
@foreach( $category->product->take(4) as $product )
{{ dd($product) }}
@endforeach
由于结果,我不知道如何实现这一目标。
答案 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