Красноречивые аргументы не распознаются красноречивыми - PullRequest
0 голосов
/ 21 января 2020

Я работаю над исправлением проекта и создал в модели область действия для запроса отношения, которое также выполняет замыкание:

Это область действия, это гостиница:

public function scopeIsHotelAvailable($query, $start_date, $end_date){

        return $query->whereHas('isAvailableInRanges', function($q) use ($start_date, $end_date) {
                    $q->isAvailableInRanges($start_date, $end_date);
            });
    }

Когда я даже пытаюсь запустить это, я получаю следующую ошибку:

$hotel->ishotelavailable($start, $end);

TypeError: Too few arguments to function Modules/Hotel/Models/Hotel::isAvailableInRanges(), 0 passed in /home/ffuentes/pk2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php on line 475 and exactly 2 expected

Я видел это раньше, но я не знаю, как заставить Eloquent распознавать аргументы.

РЕДАКТИРОВАТЬ:

Этот метод вызывается из замыкания, которое является частью модели Hotel.

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;
    }

Суть всего этого заключается в проверке результатов запроса на соответствие этим результатам и фильтрации их. Тогда, когда я начал пробовать это, я просто отфильтровал коллекцию, но она не работала, потому что возвращенная коллекция не включала нумерацию страниц и красноречивые элементы, которые она обычно несет в себе.

1 Ответ

0 голосов
/ 21 января 2020

Проблемы 1:

Вы используете метод области вместо отношения, попробуйте использовать метод отношения в whereHas , например:

->whereHas('yourRelationshipMethod', function($q) {...});

Задача 2 :

isAvailableInRanges соответствует модели отеля, поэтому вы можете назвать ее по отелю, а не по модели отношений.

Проблема 3:

Но isAvailableInRanges - это метод экземпляра, поэтому вы не можете просто вызвать его Eloquent Builder, вам нужно получить экземпляр и вызвать этот метод:

Hotel::first()->isAvailableInRanges($start_date,$end_date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...