Php 查询范围在Laravel中是如何工作的?

Php 查询范围在Laravel中是如何工作的?,php,laravel,oop,eloquent,Php,Laravel,Oop,Eloquent,我正在观看《Laracast:Laravel5.4从头开始》系列,并了解了查询范围的概念 在视频中,我们设置了这样一个类: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Task extends Model { public function scopeIncomplete($query) { return $query->where('completed

我正在观看《Laracast:Laravel5.4从头开始》系列,并了解了查询范围的概念

在视频中,我们设置了这样一个类:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{

    public function scopeIncomplete($query)
    {

        return $query->where('completed', 0);

    }
}

这是一个相当宽泛的话题,因为它涵盖了关于雄辩的两大主题


第一个是指Elount使用facade模式将静态调用传递给非静态方法

facade模式利用IoC容器将方法调用传递给类的绑定实例或新实例

facade模式使用重载和神奇的方法_callStatic


第二个问题涉及Eloquent的重载,它将未注册的方法调用传递给查询生成器对象(特别是\Lightning\Database\Eloquent\builder)。这就是允许在雄辩的模型本身上调用where()和各种其他查询生成器方法的原因。在模型类中,您可以看到:

/**
 * Handle dynamic method calls into the model.
 *
 * @param  string  $method
 * @param  array  $parameters
 * @return mixed
 */
public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
    }

    return $this->newQuery()->$method(...$parameters);
}
由于模型中未定义where()或complete(),因此它们将被传递给生成器类,该类由Model::newQuery()返回

在生成器调用方法中,您有:

    if (method_exists($this->model, $scope = 'scope'.ucfirst($method))) {
        return $this->callScope([$this->model, $scope], $parameters);
    }
这就是检查模型中定义的作用域,并传递包含此生成器实例的$parameters

总之,对Model::complete()的调用将是:


模型调用()->Builder调用()->Model scopecompleted(Builder$Builder)

感谢您为我指出了这些主题的正确方向。看起来它们很大,我还有很多要学的。应该继续这个系列@提摩太鱼杰弗里可能不会接触到这样的深潜。但是,亲自检查这些课程总是一个很好的方法,可以看出兔子洞的方向。Eloquent确实大量使用了重载,这是其有效的批评之一,但重载的使用也使语法非常有表现力且易于使用。你不一定需要了解每一个细节,只要你知道如何利用它,你就知道雄辩是如何完成任务的。