Tim*_*her 5 php oop laravel eloquent
我正在观看来自 Scratch 系列的 Laracasts:Laravel 5.4,并且遇到了查询范围的概念。
在视频中,我们设置了一个这样的类:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
public function scopeIncomplete($query)
{
return $query->where('completed', 0);
}
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题:
为什么 public function scopeIncomplete($query)像这样的方法:这样调用:App\Task::incomplete()使用::运算符?
那不是静态调用的非静态方法吗?
我的第二个问题:
哪里$query来的呢?
据我所知,这是“现有”查询,但它是这样调用的: App\Task::incomplete()->where('id', '>', 1)->get();
所以我不太确定这个变量来自哪里。
也许稍后会对其进行更深入的解释,但我无法理解这是如何工作的。
这是相当广泛的,因为它涵盖了 Eloquent 的两个大主题。
第一个是指 Eloquent 使用外观模式将静态调用传递给非静态方法。
外观模式利用 IoC 容器将方法调用传递给类的绑定实例或新实例。
外观模式利用重载和神奇方法 __callStatic。
第二个问题涉及 Eloquent 的重载,它将未注册的方法调用传递给查询构建器对象(特别是 \Illuminate\Database\Eloquent\Builder)。这就是允许在 Eloquent 模型本身上调用 where() 和各种其他查询生成器方法的原因。在 Model 类中,您可以看到:
/**
* 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);
}
Run Code Online (Sandbox Code Playgroud)
由于模型中未定义 where() 或 incomplete(),因此它们将被传递给 Builder 类,该类由 Model::newQuery() 返回。
在 Builder __call 方法中,您有:
if (method_exists($this->model, $scope = 'scope'.ucfirst($method))) {
return $this->callScope([$this->model, $scope], $parameters);
}
Run Code Online (Sandbox Code Playgroud)
因此,这是检查模型内部定义的范围并传递包含此 Builder 实例的 $parameters。
总之,对 Model::incomplete() 的调用将如下:
模型 __call() -> 生成器 __call() -> 模型范围不完整(Builder $builder)
| 归档时间: |
|
| 查看次数: |
1350 次 |
| 最近记录: |