对所有人来说,美好的一天,我是Laravel的新手,我所遇到且无法理解的是框架中使用的实用程序方法,例如Customer::all()
,其中Customer是模型,或者{{1} }。因此,实用程序方法的意义何在?为什么Customer::find()
和all()
是静态的。
答案 0 :(得分:2)
执行User::find()
时,实际上是在请求一个新实例,该实例是Collection或QueryBuilder的实例。
Illuminate \ Database \ Eloquent \ Model:https://github.com/laravel/framework/blob/master/src/Illuminate/Database/Eloquent/Model.php
作为旁注,您还将看到在Laravel中使用静态方法的另一种方式,例如Input::get()
。这些叫做立面。
外观为应用程序的IoC容器中可用的类提供了“静态”接口... Laravel“ facades”充当IoC容器中的基础类的“静态代理”,提供了简洁的表达语法的优势同时保持比传统静态方法更高的可测试性和灵活性。
当用户引用...外观上的任何静态方法时,Laravel都会从IoC容器解析缓存绑定,并对该对象运行请求的方法(在这种情况下为get)。
上了解有关Laravel Facades的更多信息。答案 1 :(得分:2)
实用程序功能通常提供某种实用程序,即通常只是为了方便起见的功能,也可以通过遵循一组步骤来实现。
例如Model::find()
是可以通过创建查询构建器对象然后执行查询来实现的功能,例如
Model::getQuery()->where('id', '=', $id)->first();
为方便起见,您可以执行Model::find($id)
,它更短,更直观。
它是静态的,因为它不是静态的没有意义。非静态方法需要类的实例,但是在ORM中,类的实例对应于潜在的数据库条目(存在或可能存在)。
因此,由于find
用于检索数据库条目,因此要求使用备用数据库条目来使用它是没有意义的。
简而言之,这意味着,如果执行方法$object = Model::find(1)
,则将返回与标识符为1
的数据库条目对应的模型。 PHP对象与关系对象之间存在一对一的映射。如果对$object
进行更改并调用$object->save()
,则更改将保留在数据库中(即$object
已经存在)。另一方面,如果您执行$object = new Model()
,则将返回当前与数据库条目不对应的新模型。但是,调用$object->save()
将使该对象对应于新的数据库条目,并且将相应地进行更新(即新对象可能存在)。如果框架要求您制作一个“虚拟”对象只是为了访问某些辅助方法,则总是有机会(通过忽略或通过未知的副作用)对该虚拟对象调用save()
并最终填充基本上是垃圾来处理数据库。
由此得出的结论是,在ORM中,如果您不打算将模型实例存储在数据库中,则创建模型实例是没有意义的。 Laravel并不严格遵守此规则,但总的来说,您确实应该遵守。
这同样适用于all
,它获取所有数据库条目。通过要求首先获得一个条目来获取所有数据库条目是没有意义的。
对以上使用的getQuery
相同,它返回查询构建器实例。请注意,大多数人实际上并不使用getQuery
,因为当某人使用诸如Model::where(..)
,因此从技术上讲,Model::where()
也是一种实用程序。我之所以这样说是因为,当您看到类似Model::where('id', $id)->where('name', $name)
的内容时,第二个位置在->
之后,这意味着它在一个实例上而不是静态上,但是该实例实际上是查询生成器实例,而不是模型实例。
答案 2 :(得分:1)
Laravel包括各种全局的“帮助程序” PHP函数。许多 这些功能由框架本身使用;但是,你是 如果觉得方便,可以在自己的应用程序中自由使用它们。
因此,基本上,Laravel中的助手是内置的实用程序函数,您可以从应用程序中的任何位置调用它们。如果核心框架没有提供它们,那么您可能最终会开发自己的帮助程序类。
尽管该内核已经提供了各种帮助程序,但总有可能需要自己的帮助程序并愿意开发一个,这样您就不必在这里和那里重复相同的代码,从而增强了可维护性。
答案 3 :(得分:1)
all()find()where()等。这些方法不是实用程序方法,它们是orm方法,来自Query Builder。
它们是静态的,因此无需创建实例即可为您提供使用
答案 4 :(得分:1)
这些方法是Eloquent系统的一部分,可帮助您从数据库中检索记录。
all
方法从数据库中获取给定模型的所有记录的 all ,并返回该模型实例的Collection
。如果您要进行User::all()
,则数据库中每个用户的集合将作为Collection
个对象中的User
个返回。
$users = User::all(); // Returns a Collection of User objects
foreach ($users as $user) {
// Here, each $user will be an instance of User
}
find
方法用于通过数据库的主键在数据库中查找模型。如果找到与给定主键匹配的记录,则此方法实际上返回单个模型实例;如果找不到任何记录,则返回null
。
$user = User::find(1); // Find a User with the primary key 1, or null
这些方法实际上不是静态的,尽管您可以像使用它们一样使用它们。 find
方法是Illuminate\Database\Eloquent\Builder
对象上的非静态方法,而all
方法是Illuminate\Database\Eloquent\Model
上的实用程序方法,该方法最终调用Builder
对象的{ {1}}方法。
当您调用get
时,Laravel将创建一个新查询或一个User::find(1)
对象,并在Builder
上调用find
方法,这将返回一个新的{{ 1}}对象,或者为null。同样,调用Builder
时,Laravel将创建一个新查询或User
对象,并调用User::all()
方法,该方法将返回您的模型集合。
Builder
类使用get()
魔术方法将对不存在的静态方法的静态方法调用重定向到Illuminate\Database\Eloquent\Model
对象。这样便可以在静态上下文中调用它们:
__callStatic
因此您可以有效地做到这一点以达到相同的结果:
Builder