【问题标题】:Eloquent passing arguments not recognized by eloquent雄辩的传递论点不被雄辩的
【发布时间】:2020-01-21 14:01:01
【问题描述】:

我正在修复一个项目,并在模型中创建了一个范围来查询也执行闭包的关系:

这是范围,是酒店:

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

所有这些的目的是根据这些结果测试查询结果并过滤它们。那时当我开始尝试它时,我只是过滤了集合,但它不起作用,因为返回的集合不包括分页和它通常在自身内部携带的雄辩元素。

【问题讨论】:

  • dd($start, $end)
  • 我删除了它。我正在调试,但这不是错误
  • 问题是关系。你使用了错误的关系...
  • 好吧,但是这种关系有什么问题?
  • 这家酒店是什么关系?

标签: php laravel eloquent


【解决方案1】:

问题一:

您使用的是范围方法而不是关系,请尝试在whereHas 中使用关系方法,例如:

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

问题2:

isAvailableInRanges 在 Hotel 模型中,因此您可以通过 Hotel 而不是关系模型来调用它。

问题3:

但是isAvailableInRanges是一个实例方法,所以不能只由Eloquent builder调用,需要获取实例并调用该方法:

Hotel::first()->isAvailableInRanges($start_date,$end_date);

【讨论】:

  • 如何重写查询或方法以便检索过滤后的查询?我不想一一检索它们。我可以得到()他们吗?并且分页丢失了!
  • 不太清楚你和其他班级的关系,很难查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2023-04-05
  • 2020-08-20
相关资源
最近更新 更多