【问题标题】:Check timing validation with scope in laravel在 laravel 中使用范围检查时间验证
【发布时间】:2018-05-30 10:50:44
【问题描述】:

我在产品表 start_discountedend_discounted 中存储了 2 个日期,这 2 列负责我的折扣价格持续时间。现在,当我的产品折扣期限到期时,除了恢复正常价格外,它仍保持折扣价,并且我的计时器变为负数。

代码

我的模型范围

public function scopeValidDiscount($query){
       return $query->where('start_discounted', '<=', Carbon::now()->toDateTimeString())
                    ->where('end_discounted', '>=', Carbon::now()->toDateTimeString());
    }

controller

public function product($slug){
     $product = Product::where('slug', $slug)->firstOrFail();
     $validdiscount = $product->ValidDiscount()->get();
     //...
}

blade

@if($validdiscount)
  show timer
@endif

PS:我需要避免在两种情况下显示计时器,1 折扣日期已过期。 2 产品折扣日期为空。

知道我的错误在哪里吗?

更新

我在刀片中的计时器:

@if($validdiscount)
<div class="deals_timer row align-items-center">
<div class="col-md-6 deals_timer_title_container">
<div class="deals_timer_title">{{__('store.hurryup')}}</div>
<div class="deals_timer_subtitle">{{__('store.endsin')}}</div>
</div>
<div class="col-md-6 deals_timer_content ml-auto">
<div class="deals_timer_box clearfix" data-target-time="{{$end}}">
<div class="text-center deals_timer_unit">
<div id="deals_timer3_hr" class="deals_timer_hr"></div>
<span>{{__('store.hours')}}</span>
</div>
<div class="text-center deals_timer_unit">
<div id="deals_timer3_min" class="deals_timer_min"></div>
<span>{{__('store.mins')}}</span>
</div>
<div class="text-center deals_timer_unit">
<div id="deals_timer3_sec" class="deals_timer_sec"></div>
<span>{{__('store.secs')}}</span>
</div>
</div>
</div>
</div>
@endif

请关注data-target-time="{{$end}}",我认为问题可能出在这里...

我的计时器脚本:

<script>
    $(document).ready(function(){
        if($('.deals_timer_box').length)
        {
            var timers = $('.deals_timer_box');
            timers.each(function()
            {
                var timer = $(this);

                var targetTime;
                var target_date;

                // Add a date to data-target-time of the .deals_timer_box
                // Format: "Feb 17, 2018"
                if(timer.data('target-time') !== "")
                {
                    targetTime = timer.data('target-time');
                    target_date = new Date(targetTime).getTime();
                }
                else
                {
                    var date = new Date();
                    date.setDate(date.getDate() + 2);
                    target_date = date.getTime();
                }

                // variables for time units
                var days, hours, minutes, seconds;

                var h = timer.find('.deals_timer_hr');
                var m = timer.find('.deals_timer_min');
                var s = timer.find('.deals_timer_sec');

                setInterval(function ()
                {
                    // find the amount of "seconds" between now and target
                    var current_date = new Date().getTime();
                    var seconds_left = (target_date - current_date) / 1000;
                    console.log(seconds_left);

                    // do some time calculations
                    days = parseInt(seconds_left / 86400);
                    seconds_left = seconds_left % 86400;

                    hours = parseInt(seconds_left / 3600);
                    hours = hours + days * 24;
                    seconds_left = seconds_left % 3600;


                    minutes = parseInt(seconds_left / 60);
                    seconds = parseInt(seconds_left % 60);

                    if(hours.toString().length < 2)
                    {
                        hours = "0" + hours;
                    }
                    if(minutes.toString().length < 2)
                    {
                        minutes = "0" + minutes;
                    }
                    if(seconds.toString().length < 2)
                    {
                        seconds = "0" + seconds;
                    }

                    // display results
                    h.text(hours);
                    m.text(minutes);
                    s.text(seconds); 

                }, 1000);
            }); 
        }
    }); 
</script>

{{$end}}

这是我在控制器中的内容,以便获取我的过期日期并在上面的 JavaScript 中使用 if:

$mytime = Carbon::now();
if(!empty($product->start_discounted && $product->end_discounted)){
  $start = $product->start_discounted->format('M d, Y');
  $end = $product->end_discounted->format('M d, Y');
}

那么我也有我的范围代码:

$validdiscount = $product->ValidDiscount()->get();

现在我认为我的问题是由以下原因引起的:我的到期日期来自 产品直接$product-&gt;end_discounted,而我在使用范围时尽量避免它 它在我的模型中做同样的碳事情,不确定! (也许我也应该按范围获取我的$end

【问题讨论】:

  • show timer 部分的详细信息?我相信它的观点是相关的。
  • 我更感兴趣的是您为什么要在已获取的 Product 上调用作用域 (validDiscount())。产品表上有start_discountedend_discounted 字段吗?
  • @BagusTesa 更新了我的问题。
  • @devk 是的,正如我在问题顶部所解释的那样,I store 2 dates in my products table 所以我没有使用任何折扣表,这就是我的范围在我的产品表中的原因。

标签: laravel scope


【解决方案1】:

您没有正确使用范围。 Scopes 用于查询构建器,而不是已检索的模型。

为此,您只需要一个常规方法:

public function validDiscount() {
    return $this->start_discounted <= now()->toDateTimeString()
        && $this->end_discounted >= now()->toDateTimeString();
}

然后在您的视图中,像这样检查它:

@if($product->validDiscount())
  show timer
@endif

并删除不需要的$validdiscount = $product-&gt;ValidDiscount()-&gt;get();(您在模型实例上使用查询范围)。

【讨论】:

    【解决方案2】:

    你可以在前端使用 javascript/jquery 来做。

    1. 当您填充该页面时,调用该 js 函数来检查该值,如下所示 $(document).ready(function(){ check_timer() })

    2. 然后在计时器到期时再次触发该方法以更新您的视图(隐藏促销价格、隐藏计时器和显示实际价格)

    check_timer函数可以这样

    function check_timer(){
      if(!{{ $validdiscount }}){
       //hide your required div 
     }
    }
    

    【讨论】:

    • 我正在为我的计时器使用 JavaScript。我会更新我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 2015-04-16
    • 1970-01-01
    • 2016-05-10
    • 2015-06-04
    • 2017-01-19
    相关资源
    最近更新 更多