Laravel Collection 日期比较
Laravel Collection Date comparison
好吧,我花了好几个小时寻找答案,但似乎找不到。
我有一个 "orders" 数组,用于不同的日期。我收到了本周的所有订单,这应该不是问题,然后我想为一周中的每一天创建一个标签。
到目前为止我尝试过的是:
$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 是 collection?
我得到的是空集,尽管它在 mysql 终端中工作。
所以我想问的是,您可以在 collection 上进行日期比较吗?如果是,怎么做?
注意:此答案特定于 Laravel <= 5.2。 Laravel 5.3 更新了 Collection
上的 where()
方法以匹配查询构建器,因此它现在接受运算符。
正如您在问题中所述,$dinnerOrders
是一个集合,而不是一个查询。 Collection
上的 where()
方法略有不同。
对于集合,where()
方法不接受运算符。它只做平等比较。第一个参数是键,第二个是值,第三个是布尔值,用于标记松散比较 (==) 与严格比较 (===)。
您正在寻找的是 filter()
方法。您传入一个进行日期比较的闭包。如果 Closure returns 为 true,则该项目保留在 Collection 中。如果它 returns 为假,则该项目将从集合中删除。像这样(只是一个例子,逻辑可能需要调整):
$dinnerOrders = $dinnerOrders->filter(function ($item) use ($date) {
return (data_get($item, 'date') > $date) && (data_get($item, 'date') < $date->endOfDay());
});
Post 问题编辑
根据您编辑中提供的代码,我猜测一家餐厅有很多晚餐,而晚餐有很多订单。如果这是正确的,您可以建立一个关系,说明餐厅在晚餐期间有许多订单:
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();
好吧,我花了好几个小时寻找答案,但似乎找不到。 我有一个 "orders" 数组,用于不同的日期。我收到了本周的所有订单,这应该不是问题,然后我想为一周中的每一天创建一个标签。
到目前为止我尝试过的是:
$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 是 collection?
我得到的是空集,尽管它在 mysql 终端中工作。
所以我想问的是,您可以在 collection 上进行日期比较吗?如果是,怎么做?
注意:此答案特定于 Laravel <= 5.2。 Laravel 5.3 更新了 Collection
上的 where()
方法以匹配查询构建器,因此它现在接受运算符。
正如您在问题中所述,$dinnerOrders
是一个集合,而不是一个查询。 Collection
上的 where()
方法略有不同。
对于集合,where()
方法不接受运算符。它只做平等比较。第一个参数是键,第二个是值,第三个是布尔值,用于标记松散比较 (==) 与严格比较 (===)。
您正在寻找的是 filter()
方法。您传入一个进行日期比较的闭包。如果 Closure returns 为 true,则该项目保留在 Collection 中。如果它 returns 为假,则该项目将从集合中删除。像这样(只是一个例子,逻辑可能需要调整):
$dinnerOrders = $dinnerOrders->filter(function ($item) use ($date) {
return (data_get($item, 'date') > $date) && (data_get($item, 'date') < $date->endOfDay());
});
Post 问题编辑
根据您编辑中提供的代码,我猜测一家餐厅有很多晚餐,而晚餐有很多订单。如果这是正确的,您可以建立一个关系,说明餐厅在晚餐期间有许多订单:
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();