我是 Laravel 和 Eloquent 的新手,所以如果这是一个完全愚蠢的问题,请原谅。 我一直在研究如何在文档 here 中创建模型还有另一个教程 here (在使用 Eloquent ORM 创建模型部分)并且我注意到表的实际字段从未被提及,除非它们有特定的内容(例如与另一个表有关系,或者不需要批量分配,或者如果它们需要从 JSON 输出等中隐藏。)
这些字段是否被故意省略,而 PHP 在启用 FETCH_OBJ
的情况下使用 PDO 执行查询时只是添加它们?
如果是的话,为什么我们没有明确地将字段放入模型中?难道它不能帮助我们了解我们有哪些字段,以及 PHPStorm 等 IDE 弹出正确的自动完成字段吗?
如果确实需要它们,那么它们需要具有什么访问级别?
谢谢。
最佳答案
Eloquent 模型中不需要列名称(字段)。正如您所指出的,只需要定义确定模型与其他模型之间关系的函数即可。
由于您提到的原因,没有必要包含它们(Laravel 执行 select *
,然后将所有返回的行作为公共(public)属性添加到模型对象中)。这是一个被称为“水合作用”的过程,您可以通过深入研究 Laravel 源代码来准确了解发生了什么。以下是所发生情况的摘要:
- 您调用(例如)
Users::find(123);
-
Illuminate\Database\Eloquent\Model::find()
来电Illuminate\Database\Eloquent\Builder::find()
-
find()
构造SELECT * FROM users WHERE id = 123
查询,然后通过调用Illuminate\Database\Eloquent\Builder::first()
返回第一个结果 -
first()
添加LIMIT 1
通过调用Illuminate\Database\Query\Builder::take()
- 然后
first()
通过调用*
设置要检索的列(默认为Illuminate\Database\Eloquent\Builder::get()
) . -
get()
返回Illuminate\Database\Eloquent\Collection
通过使用Illuminate\Database\Eloquent\Builder::getModels()
的返回值 -
getModels()
实际上执行查询然后调用Illuminate\Database\Eloquent\Model::newFromBuilder()
对于返回的每一行 -
newFromBuilder()
创建模型的新实例并通过调用Illuminate\Database\Eloquent\Model::setRawAttributes()
设置列(字段)
我省略了一些不相关的事情,例如急切加载以简化过程,但这基本上是每个查询发生的情况。
您说得很好,提前了解字段有助于自动完成。 由于 setRawAttributes()
的性质声明模型中的所有列名称(字段)是完全可以的(只需确保它们是公共(public)的)。不过,惯例(为了你的理智)是忽略它们。此类声明应留给 migration files .罢工>
经过进一步检查源代码,预先声明字段不是可以的。这是因为实际的属性值存储在 $attributes
中。属性,然后通过魔术方法访问 __get()
。这里的问题是,通过预先定义属性,您将阻止 __get()
当您访问字段时不会被调用。因此,这不是一个选择。
关于php - Laravel Eloquent 模型中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111283/