我有一个带有字段的预订表:
我选择其中一些预订,并将其显示为列表。我还会检查以前的预订是否相隔不到30天。
为此,我会为每个预订查询上一个预订:
@if ($booking->previousBooking()) // Simplified version but you get the idea
底层代码:
public function previousBooking()
{
return Booking::where('from', '<', $this->from)
->orderByDesc('from')
->first();
}
您可能已经猜到了:它为每个预订添加查询。
最好的方案是急于加载“以前的预订”(带有),以便可以像以下方式进行访问:
$booking->previous_booking->from
有没有办法做到这一点?
限制条件:
看看乔纳森·赖因克(Jonathan Reinink)的这篇文章。您可以通过previous_booking_id
在预订模型上模拟来应用他的解决方案。然后添加previousBooking()
关系并使用进行查询with('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');
}
现在,您可以使用以下方法获取所有包含其先前预订ID的预订:
$bookings = Booking::withPreviousBooking()->get();
现在所有的预订都应该有一个previous_booking_id
。我们with('previousBooking')
在范围的末尾添加,就像在查询预订的关系一样。Eloquent并不关心它是否previous_booking_id
在数据库中,只要它在模型中可用(我们已经通过addSelect()
方法完成)即可。
现在,您应该可以在视图中使用请求的解决方案:
$booking->previousBooking->from
注意:仅在应用范围后才能访问previousBooking关系。如果没有,previous_booking_id
则不可用,因此该关系将为null。如果您始终想加载以前的预订,请考虑将其添加为全局范围。但是,我建议仅在需要的地方应用范围。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句