【问题标题】:Get dates between two dates and return resources available in Laravel获取两个日期之间的日期并返回 Laravel 中可用的资源
【发布时间】:2021-10-03 05:51:52
【问题描述】:

我有一些奇怪的查询需要在 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) {
                $query
                  ->whereRaw('resource_id = resources.id')
                  ->where('bookings.start_date', '>=', $start_date)
                  ->where('bookings.end_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();
}

我做错了什么?

【问题讨论】:

    标签: laravel laravel-7 php-carbon


    【解决方案1】:

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

    $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

    已添加:

    另请参阅您的堆叠where()-&gt;orWhere()-&gt;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 <=
    })
    

    【讨论】:

    • 我试过这个,但它只带回了第一天的资源,而不是其他天。
    • 抓住了 - 见我上面的补充
    猜你喜欢
    • 2018-01-11
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    • 2010-10-05
    • 2017-06-03
    • 2013-08-09
    • 1970-01-01
    • 2019-08-02
    相关资源
    最近更新 更多