【问题标题】:Laravel Collection Date comparisonLaravel 合集日期比较
【发布时间】:2016-02-21 18:00:50
【问题描述】:

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

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

$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 终端中工作。

所以我要问的是,你能对一个集合进行日期比较吗?如果有,怎么做?

【问题讨论】:

  • 您可能没有正确构建整个查询,并且您只发布了一个看起来不错的部分。因此,不要使用get() 来检索您的结果,而是使用toSql(),这将返回一个字符串,其中包含查询生成器正在构建和运行的SQL 查询。这与您手动运行的匹配吗?
  • 我会检查正在执行的查询。在执行查询后放置此代码并检查执行的 sql beding:dd(DB::getQueryLog())(要使用 DB,您应该导入它:use Illuminate\Support\Facades\DB;)
  • @Bogdan toSql() 不起作用,因为 $dinnerOrders 是一个已经被 sql 检索到的集合,抱歉应该更清楚。已更新原始问题。
  • 我的错,你很清楚这是原始问题的集合,我只是错过了这个事实。

标签: php laravel laravel-5 php-carbon laravel-collection


【解决方案1】:

注意:此答案特定于 Laravel Collection 上的 where() 方法以匹配查询构建器,因此它现在接受一个运算符。


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

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

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

$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();

【讨论】:

  • 谢谢!这工作得很好,唯一的问题是我的 $date 由于某种原因是一天的结束,所以我只是将函数中的 $date 切换到 $date->startOfDay()
  • @user3032753 是的,我没有测试所有碳比较的东西,所以我认为您可能需要稍微更改代码,但我想了解这个想法。我很高兴它有所帮助。
猜你喜欢
  • 2013-02-09
  • 2016-07-25
  • 1970-01-01
  • 2016-08-09
  • 2020-05-31
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多