微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取两个日期之间的日期并返回 Laravel 中可用的资源 添加:

如何解决获取两个日期之间的日期并返回 Laravel 中可用的资源 添加:

我有一个奇怪的查询需要在 Laravel 中运行。

我需要获取从当前日期到接下来两周的每一天,然后根据这些天数返回每天可用的资源。当我使用单个日期作为我的开始和结束日期时,它可以工作,但在多天中它不会返回任何资源。

首先在我的控制器中,我创建了一个这样的日期范围:

$availabilityRange = CarbonPeriod::create(Carbon::Now()->startOfDay(),Carbon::Now()->addDays(14)->startOfDay()); 

对于一天开始和一天结束的单个日期,我像这样检索它,它会带回仅在该日期未预订的资源:

$start_date = Carbon::tomorrow()->startOfDay();
$end_date = Carbon::tomorrow()->endOfDay(); 

然后我遍历我的预订以检查哪些资源可用,如下所示:

$resource = Resource::join('resource_teachers','resources.id','=','resource_teachers.resource_id')
          ->where('resource_teachers.subject_id',$id)
          ->where('resource_subjects.deleted_at',NULL)
          ->select("resources.name","resources.surname","resources.id")
          ->whereNotExists(function ($query) use ($start_date,$end_date) {
            $query
              ->select(DB::raw(1))
              ->from('bookings')
              ->whereRaw('bookings.resource_id = resources.id')
              ->where(function ($query) use ($start_date,$end_date) {
                $query
                  ->whereRaw('bookings.resource_id = resources.id')
                  ->where('bookings.start_date','<=',$start_date)
                  ->where('bookings.end_date','>=',$start_date);
              })->orWhere(function ($query) use ($start_date,$end_date) {
                $query
                  ->whereRaw('resource_id = resources.id')
                  ->where('bookings.start_date',$end_date)
                  ->where('bookings.end_date',$end_date);
              })->orWhere(function ($query) use ($start_date,$end_date);
              });
          })
          ->get(); 

然后我像这样在我的刀片文件显示资源:

@foreach($availabilityRange as $date)
  <tr>
    <td>
       {{ $date->toDateString() }}
        </td>
         <td>
          @if(($date == $start_date))
           @foreach($resource as $availableResource)
            <div class="badge badge-primary mr-1 mb-1">{{ $availableResource->name }} {{ $availableResource->surname }}</div>
             @endforeach
           @endif
    </td>
  </tr>
@endforeach

如果我像这样尝试获取资源多天,它什么也不显示

$start_date = new DateTime(Carbon::Now()->startOfDay());
$end_date   = new DateTime(Carbon::Now()->addDays(14)->startOfDay());

我也试过了,没用:

foreach ($availabilityRange as $start_date) {
  $start_date->startOfDay()->toArray();
}

foreach ($availabilityRange as $end_date) {
  $end_date->endOfDay()->toArray();
}

我做错了什么?

解决方法

对于某一天,您将获得这样的开始和结束日期:

$start_date = Carbon::tomorrow()->startOfDay();
$end_date = Carbon::tomorrow()->endOfDay(); 

但是有好几天你都这样(使用 DateTime):

$start_date = new DateTime(Carbon::now()->startOfDay());
$end_date   = new DateTime(Carbon::now()->addDays(14)->startOfDay());

要运行您的查询,您需要一个 Carbon 实例,因此请尝试将上述代码更改为:

$start_date = Carbon::now()->startOfDay();
$end_date   = Carbon::now()->addDays(14)->startOfDay();

另请参阅文档中的 whereDay() 和其他 where 子句:https://laravel.com/docs/8.x/queries#additional-where-clauses

添加:

另看你的stacked where()->orWhere()->orWhere()...,我觉得你需要改变一些变量和条件,例如:

->where(function ($query) use ($start_date,$end_date) {
    $query
        ->whereRaw('bookings.resource_id = resources.id')
        ->where('bookings.start_date','<=',$start_date) // should be  >=
        ->where('bookings.end_date','>=',$start_date); // should be $end_date and <=
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?