我是Laravel和Eloquent的新手,请原谅我这是一个完全愚蠢的问题 . 我一直在研究如何在文档here以及另一个教程here(在使用Eloquent ORM创建模型部分)中创建模型,我注意到表中的实际字段从未被提及,除非有什么东西具体关于它们(比如与另一个表有关系,或者不需要批量分配,或者是否需要隐藏JSON输出等)
是否故意省略这些字段,PHP只是在使用PDO执行查询时添加它们并打开_1354901?如果是,为什么我们没有明确地将字段放在模型中?它不能帮助我们了解我们拥有哪些字段,以及PHPStorm等IDE可以弹出正确的自动完成字段吗?
如果确实需要它们,他们需要具备哪种访问级别?
谢谢 .
1 回答
Eloquent模型中不需要列名(字段) . 正如您所指出的,只需要定义确定模型与其他模型之间关系的函数 .
没有必要包含它们,因为你提到的原因(Laravel做了
select *
然后将所有返回的行作为公共属性添加到模型对象中) . 这是一个名为水合作用的过程,您可以通过挖掘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()
通过调用Illuminate\Database\Query\Builder::take()添加LIMIT 1
然后
first()
通过调用Illuminate\Database\Eloquent\Builder::get()设置要检索的列(默认情况下为*
) .get()
使用Illuminate\Database\Eloquent\Builder::getModels()的返回值返回Illuminate\Database\Eloquent\CollectiongetModels()
实际执行查询,然后为返回的每一行调用Illuminate\Database\Eloquent\Model::newFromBuilder()newFromBuilder()
创建模型的新实例,并通过调用Illuminate\Database\Eloquent\Model::setRawAttributes()设置列(字段)我省略了一些不相关的东西,比如急切加载以简化过程,但这基本上是每个查询都会发生的事情 .
您明确了解事先知道字段可能有助于自动完成 . 由于setRawAttributes()的性质,在模型中声明所有列名(字段)是完全可以的(只需确保它们是公共的) . 虽然(并且为了你的理智),这个惯例是省略它们 . 此类声明应留给迁移文件 .
在进一步检查源之后,事先声明字段是确定的 . 这是因为实际属性值存储在
$attributes
属性中,然后由魔术方法__get()
访问 . 这里的问题是,通过预先定义属性,您将阻止在访问字段时调用__get()
. 因此,这不是一种选择 .但是,有ways to hint to editors (like PhpStorm) about the existence of properties without explicitly defining them .