Использование прицела в лезвии ларавеллы - PullRequest
0 голосов
/ 03 мая 2018

У меня есть эта область в моей модели:

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

То, что я пытаюсь сделать, это показать два текста в моем клинке valid или expired в зависимости от их value_from & value_to столбцов, но все, что я получаю, это один и тот же результат для обоих типов.

Я получаю valid за действительные и просроченные купоны, которые у меня есть.

вот как я пытаюсь это сделать:

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

что мне идти?

UPDATE

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 голосов
/ 03 мая 2018

Вы пытаетесь получить логическое значение из экземпляра запроса, в этой ситуации лучше использовать аксессор, основная проблема здесь в том, что вы используете пользовательский формат даты 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;
}

И для вызова области вы не используете заглавную букву:

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

Надеюсь, это поможет вам.

0 голосов
/ 03 мая 2018

В вашем примере вы даже не вызываете одну и ту же функцию, возможно, вам нужно изменить

$coupon->Valid() 

до

scopeValid($coupon)

для начала.

Предполагая, что $ coupon является коллекцией, я думаю, вам следует изменить функцию на что-то вроде:

public function scopeValid($query){
        $valid_result_count = $query
                ->where('value_from', '<=', Carbon::now()->toDateTimeString())
                ->where('value_to', '>=', Carbon::now()->toDateTimeString())
                ->count();
        return ($valid_result_count > 0);
    }
0 голосов
/ 03 мая 2018

В вашем случае нет необходимости использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...