拉拉维尔收藏日期比较

好吧,所以我一直在寻找几个小时的答案,但似乎找不到答案。我有一系列“订单”,都是针对不同日期的。我收到了本周的所有订单,这应该不是问题,然后我想为一周中的每一天添加一个标签。

到目前为止,我尝试过的是:

$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

注意:这个答案是特定于Laravel<= 5.2。Laravel 5.3 更新了 上的方法以匹配查询生成器,因此它现在接受运算符。where()Collection


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

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

你要找的是方法。您传入了执行日期比较的关闭。如果闭包返回 true,则该项将保留在集合中。如果它返回 false,则从“集合”中删除该项目。像这样的东西(只是一个例子,逻辑可能需要调整):filter()

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

发布问题编辑

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

餐厅.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();

答案 2

推荐