Laravel按日期获取以前的记录(优化)

Laravel按日期获取以前的记录(优化),laravel,eloquent,laravel-6,eager-loading,Laravel,Eloquent,Laravel 6,Eager Loading,我有一个带有字段的预订表: 名称|字符串 自|日期时间 到|日期时间 我选择其中一些预订并将其显示为列表。我还要检查之前的预订是否相隔不到30天 我通过查询前一次预订的每次预订来实现这一点: @if ($booking->previousBooking()) // Simplified version but you get the idea 底层代码: public function previousBooking() { return Booking::w

我有一个带有字段的预订表:

  • 名称|字符串
  • 自|日期时间
  • 到|日期时间
我选择其中一些预订并将其显示为列表。我还要检查之前的预订是否相隔不到30天

我通过查询前一次预订的每次预订来实现这一点:

@if ($booking->previousBooking()) // Simplified version but you get the idea
底层代码:

public function previousBooking()
    {
        return Booking::where('from', '<', $this->from)
            ->orderByDesc('from')
            ->first();
    }
有没有可能这样做

限制条件:

  • 我无法查询所有预订,按“发件人”排序,然后只获取上一个索引
看看乔纳森·雷因克的作品。您可以通过在您的预订模型上模拟以前的预订id来应用他的解决方案。然后添加
previousBooking()
关系,并使用
和('previousBooking')
查询该关系。如果您在实施方面需要任何帮助,请告诉我

更新
将以下范围添加到您的预订模型中:

public function previousBooking()
{
    return $this->belongsTo(Booking::class);
}

public function scopeWithPreviousBooking($query)
{
    $query->addSelect(['previous_booking_id' => Booking::select('id')
        ->whereColumn('previous_booking.from', '<', 'bookings.to')
        ->orderByDesc('from')
        ->take(1)
    ])->with('previousBooking');
}
所有预订现在都应该有
以前的预订\u id
。我们将
和('previousBooking')
添加到范围的末尾,就像我们查询预订的关系一样。只要模型中有可用的
addSelect()

您现在应该能够在视图中使用请求的解决方案:

$booking->previousBooking->from

注意:如果应用了范围,则只能访问previousBooking关系。如果不可用,则先前的预订id不可用,因此关系将为空。如果您总是希望加载以前的预订,请考虑将其添加为。但是,我建议只在需要的地方应用范围。

您如何模拟以前的预订id?我已经更新了答案。这对你来说应该很好!这是我所知道的最优化的解决方案。好吧,我做到了这一点(添加了return$this->belongsTo(Booking::class,'previous_Booking_id'))。但是现在我每次预订都得到了相同的前一次预订(相同的ID)。你知道这可能来自哪里吗?问题在子查询中。“from”是约会吗?你能确定这些记录不是都有相同的来源吗?尝试重写子查询以确保选择了正确的上一个bookingYup找到它。我需要这样更改表名:DB::table('Bookings AS previous_booking')->select('previous_booking.id'))
$bookings = Booking::withPreviousBooking()->get();
$booking->previousBooking->from