在laravel刀片中使用范围

时间:2018-05-03 09:48:36

标签: php laravel

我的模型中有这个范围:

public function scopeValid($query){
  return $query->where('value_from', '<=', Carbon::now()->toDateTimeString())
                ->where('value_to', '>=', Carbon::now()->toDateTimeString());
}

我尝试做的是在我的刀片validexpired中显示两个文字取决于他们value_from&amp; value_to列,但我得到的两种类型都是相同的结果。

我获得有效和过期优惠券的valid

这是我尝试的方式:

foreach($coupons as $coupon){
  if($coupon->Valid()){
    $validation = 'Valid';
  }else{
    $validation = 'Expired';
  }
}

我该怎么办?

更新

my blade view

screen1

my database screen2

my full function

public function index()
    {
      $coupons = Coupon::orderby('id', 'desc')->get();
      $categories = Category::all();

      foreach($coupons as $coupon){
        if($coupon->valid()){
          $validation = 'Valid';
        }else{
          $validation = 'Expired';
        }
      }
      return view('admin.coupons.index', compact('coupons', 'categories', 'validation'));
    }

my full model

public function scopeValid($query){
        return $query->where('value_from', '<=', Carbon::now()->toDateTimeString())
                ->where('value_to', '>=', Carbon::now()->toDateTimeString());
    }

3 个答案:

答案 0 :(得分:2)

在您的情况下,无需使用scope,但您可以使用accessor作为已提取的数据:

在你的模特中:

public function getIsValidAttribute()
{
  $now = Carbon::now();

  return Carbon::parse($this->value_from)->lt($now) && Carbon::parse($this->value_to)->gt($now);

}

最后在blade view中调用它:

@foreach ($coupons as $coupon
  @if($coupon->isValid)
    <span>Valid</span>
  @else
    <span>Expired</span>
  @endif
@endforeach

答案 1 :(得分:2)

您正在尝试从查询实例中获取布尔值,访问者更适合这种情况,这里的主要问题是您使用的是自定义日期格式<div class="m-form__group form-group row"> <div class="col-9"> <div class="m-radio-inline mt-3"> <label class="m-radio"> <input type="radio" name="type" value="1" checked> First <span></span> </label> <label class="m-radio"> <input type="radio" name="type" value="2" required=""> Second <span></span> </label> </div> </div> </div> <div class="text-div first">First Content</div> <div class="text-div second">Second Content</div>d-m-Y方法正在生成整个toDateTimeString,请尝试使用datetime进行等效比较:

format

要调用范围,请不要使用大写字母:

public function getValidAttribute($value){
  $date =  \Carbon\Carbon::now()->format('d-m-Y');
  return $this->value_from >= $date && $this->value_to <= $date;
}

希望它对你有所帮助。

答案 2 :(得分:1)

在你的例子中,你甚至没有调用相同的功能,也许你需要改变

df

df.foo.str.lower().str.split(' ')... # rest of line from above.

开头。

假设$ coupon是一个集合,我认为你应该将函数改为:

$coupon->Valid()