雄辩的如何将参数传递给关系

时间:2020-01-15 22:54:05

标签: laravel eloquent

我要修复的代码如下所示。我有一个酒店类,该类在查询中用于获取区域中的所有酒店,但不会丢弃那些不可用的酒店。里面有一个方法应该是一个访问器,但它的编写方式并非我期望的那样:

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();

是否可以将天数范围传递给函数?

通过这种方式,我尝试的第一件事是在查询后使用集合,并在集合中传递过滤器函数,然后手动分页,但是尽管它确实进行过滤,但显然会丢失 “雄辩的”结果集集合属性,它最终成为常规集合,因此不适用于我。

1 个答案:

答案 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();

请记住,在查询范围内,您将返回一个集合。您所有可用酒店的集合。