我在Laravel doc上看到了这段代码
// Retrieve a model by its primary key...
$flight = App\Flight::find(1);
// Retrieve the first model matching the query constraints...
$flight = App\Flight::where('active', 1)->first();
where和find是构建器函数,为什么App \ Flight作为Model可以调用这些函数。 Laravel中Model,Builder和Collection之间有什么区别?
答案 0 :(得分:3)
您可以在Eloquent模型上调用Builder
个函数,因为Model
类使用了魔术__call
方法。
正如您在下面的方法定义中所看到的,如果该方法不存在于该类中,或者它不是increment
或decrement
,那么新的{{1创建查询,调用该方法。
Builder
https://github.com/illuminate/database/blob/master/Eloquent/Model.php#L1439
至于public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return $this->$method(...$parameters);
}
try {
return $this->newQuery()->$method(...$parameters);
} catch (BadMethodCallException $e) {
throw new BadMethodCallException(
sprintf('Call to undefined method %s::%s()', get_class($this), $method)
);
}
}
,Model
和Builder
之间的差异:
Collection
:这遵循模式本质上是数据库行的实例的模式,允许您创建,更新和删除单行。
Model
:这是应用程序和数据库之间的抽象层。通常,它用于为您提供通用API,以构建与平台无关的数据库查询。例如。他们将在MySQL,Postgres,SQL Server等上工作。
Builder
:这基本上是类固醇的Collection
。它为标准array
类型的PHP函数提供了可链接的API,以及用于处理数据集合的其他有用函数。