此功能是否会持续返回即将到来和/或当前周末的日期?

时间:2016-11-22 17:03:50

标签: laravel eloquent

除非我们在周末,否则我需要这个来返回即将到来的周末范围内的所有工作。然后我需要它来返回当前周末内的所有工作。这个逻辑听起来不错吗?

public function index()
{
    $friday = Carbon::parse("this friday 6 pm");
    $sunday = Carbon::parse("this sunday 11:59 pm");

    if ($friday < Carbon::now()){
        $friday = Carbon::parse("last friday 6pm");
    }

    $jobs = Job::whereBetween('start_date', [$friday, $sunday])->get();
    return view('foo.bar.index', ['jobs' => $jobs]);
}

1 个答案:

答案 0 :(得分:1)

逻辑看起来很合理,但你无法确定。

说实话,这是单元测试真正善于处理的确切类型。他们会指出你逻辑中的任何缺陷,如果你确实错了,你可以编写回归测试,以确保它不会再次发生。

如果由于某种原因你不能这样做,那么我将它提取到local scope,然后使用php artisan tinker命令自行测试。

这样的东西
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class Job extends Model
{

    // ...

    function scopeForUpcomingWeekend(Builder $query)
    {
        $friday = Carbon::parse("this friday 6 pm");
        $sunday = Carbon::parse("this sunday 11:59 pm");

        if ($friday < Carbon::now()){
            $friday = Carbon::parse("last friday 6pm");
        }

        return $query->whereBetween('start_date', [$friday, $sunday]);
    }

    // ...

}

这种方式更灵活,更可重用,更易于测试。此时您需要做的就是运行tinker命令。并做这样的事情:

Psy Shell v0.7.2 (PHP 7.0.8-2+deb.sury.org~xenial+1 — cli) by Justin Hileman
>>> $jobs = \App\Job::forCommingWeekend()->get();
>>> $job = $jobs->first();
>>> $job->start_date = \Carbon\Carbon::parse('2012-9-5 23:26:11');
>>> $job->save();
>>> $jobs = \App\Job::forCommingWeekend()->get();

然后重复,直到找到打破它的方法。