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
- 名称|字符串
- 自|日期时间
- 到|日期时间
@if ($booking->previousBooking()) // Simplified version but you get the idea
底层代码:
public function previousBooking()
{
return Booking::where('from', '<', $this->from)
->orderByDesc('from')
->first();
}
有没有可能这样做
限制条件:
- 我无法查询所有预订,按“发件人”排序,然后只获取上一个索引
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