Laravel Collection日期比较

时间:2015-11-19 14:22:24

标签: php sql date laravel php-carbon

好吧所以我一直在寻找答案的时间,但似乎找不到答案。 我有一系列"订单"所有的不同日期。我得到了本周的所有订单,这应该不是问题,然后我想要一周中每一天的标签。

到目前为止我所尝试的是:

$dinnerOrders->where('date','>',$date)->where('date','<', $date->endOfDay())->sortBy('created_at');

$ date是:

$dt = Carbon\Carbon::create()->startOfWeek();
Carbon\Carbon::setTestNow($dt);
$date = new Carbon\Carbon('this ' . $day);

并且$ dinnerOrders得到了:

$dinnerOrders = collect([]);
foreach($restaurant->dinners as $dinner) {
    foreach($dinner->orders as $order) {
        $dinnerOrders[$order->id] = $order;
    }
 }

日期似乎正确,它在sql中的单词。这是不行的,因为$ dinnerOrders是一个集合?

尽管它在mysql终端中运行,但我得到的并不是什么,即空集。

所以我要问的是,您可以对收藏品进行日期比较吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:12)

正如您在问题中所述,$dinnerOrders是一个集合,而不是一个查询。 where()上的Collection方法的工作方式略有不同。

对于集合,where()方法不接受运算符。它只进行相等比较。第一个参数是键,第二个是值,第三个是用于标记松散比较(==)与严格比较(===)的布尔值。

您正在寻找的是filter()方法。你传递一个Closure进行你的日期比较。如果Closure返回true,则该项目将保留在Collection中。如果返回false,则从Collection中删除该项。像这样的东西(只是一个例子,逻辑可能需要调整):

$dinnerOrders = $dinnerOrders->filter(function ($item) use ($date) {
    return (data_get($item, 'date') > $date) && (data_get($item, 'date') < $date->endOfDay());
});

发布问题编辑

根据你编辑中提供的代码,我猜一家餐馆有很多晚餐,晚餐有很多订单。如果这是正确的,您可以建立一个关系,表明餐厅通过晚餐有很多订单:

Restaurant.php:

public function orders() {
    // restaurant has many orders through dinners
    $this->hasManyThrough('App\Order', 'App\Dinner');
}

通过此关系设置,您可以使用查询构建器获取您的信息:

$dinnerOrders = $restaurant->orders()->where('date','>',$date)->where('date','<', $date->endOfDay())->get();