我要修复的代码如下所示。我有一个酒店类,该类在查询中用于获取区域中的所有酒店,但不会丢弃那些不可用的酒店。里面有一个方法应该是一个访问器,但它的编写方式并非我期望的那样:
public function isAvailableInRanges($start_date,$end_date){
$days = max(1,floor((strtotime($end_date) - strtotime($start_date)) / DAY_IN_SECONDS));
if($this->default_state)
{
$notAvailableDates = $this->hotelDateClass::query()->where([
['start_date','>=',$start_date],
['end_date','<=',$end_date],
['active','0']
])->count('id');
if($notAvailableDates) return false;
}else{
$availableDates = $this->hotelDateClass::query()->where([
['start_date','>=',$start_date],
['end_date','<=',$end_date],
['active','=',1]
])->count('id');
if($availableDates <= $days) return false;
}
// Check Order
$bookingInRanges = $this->bookingClass::getAcceptedBookingQuery($this->id,$this->type)->where([
['end_date','>=',$start_date],
['start_date','<=',$end_date],
])->count('id');
if($bookingInRanges){
return false;
}
return true;
}
我想使用此查询过滤掉酒店。这是来自控制器的查询:
$list = $model_hotel->with(['location','hasWishList','translations','termsByAttributeInListingPage'])->get();
是否可以将天数范围传递给函数?
通过这种方式,我尝试的第一件事是在查询后使用集合,并在集合中传递过滤器函数,然后手动分页,但是尽管它确实进行过滤,但显然会丢失 “雄辩的”结果集集合属性,它最终成为常规集合,因此不适用于我。
答案 0 :(得分:0)
也许最好的方法是创建查询范围(source),并将所有逻辑放入该函数中。
之后,您可以调用此作用域并传递日期。例如,您将创建一个查询范围并将代码粘贴到其中。
public function scopeisAvailableInRanges($query, $start_date, $end_date) {
}
然后,您将像这样在控制器中调用此查询范围。
$list = $model_hotel::isavailableinranges($start_date, $end_date)->with(['location','hasWishList','translations','termsByAttributeInListingPage'])->get();
请记住,在查询范围内,您将返回一个集合。您所有可用酒店的集合。