我一直在研究如何在文档 here和另一个教程 here(在使用雄辩ORM部分创建模型)中创建模型,我注意到表中的实际字段从未被提及,除非有某些东西具体关于它们(例如与另一个表有关系,或者不需要大量分配,或者如果需要从JSON输出中隐藏)
这些字段是否在目的上被省略,PHP只是在使用FETCH_OBJ打开的PDO执行查询时添加它们?
如果是的,为什么我们不明确地将这些字段放在模型中?它不能帮助我们知道我们拥有哪些领域,还有诸如PHPStorm等IDE可以弹出正确的自动完成字段?
如果实际需要,他们需要有什么访问级别?
谢谢.
由于您提到的原因(Laravel执行select *,然后将所有返回的行添加到模型对象作为公共属性),因此不需要包含它们.这是一个称为水合的过程,您可以通过挖掘Laravel来源来确切了解发生的情况.这是一个总结,发生了什么:
>你调用(例如),Users :: find(123);
> Illuminate\Database\Eloquent\Model::find()
电话Illuminate\Database\Eloquent\Builder::find()
> find()构造SELECT * FROM用户WHERE id = 123查询,然后通过调用Illuminate\Database\Eloquent\Builder::first()
返回第一个结果
> first()通过调用Illuminate\Database\Query\Builder::take()
添加LIMIT 1
>然后通过调用Illuminate\Database\Eloquent\Builder::get()
,first()设置要检索的列(默认为*).
> get()返回值为Illuminate\Database\Eloquent\Collection
,返回值为Illuminate\Database\Eloquent\Builder::getModels()
> getModels()实际执行查询,然后调用Illuminate\Database\Eloquent\Model::newFromBuilder()
为每行返回
> newFromBuilder()创建一个新的模型实例,并通过调用Illuminate\Database\Eloquent\Model::setRawAttributes()
设置列(字段)
我省略了一些无关紧要的事情,如加载加载来简化进程,但这基本上是每个查询发生的情况.
你提出一个很好的一点,即事先知道这些领域对自动完成有帮助.由于setRawAttributes()的性质,您可以在模型中声明所有列名(字段)(只是确保它们是公共的).虽然(和你的理智),公约是省略它们.此类声明应留给migration files.
经过进一步检查后,事先申报田地是不行的.这是因为实际的属性值存储在$attributes属性中,然后由magic方法__get()访问.这里的麻烦在于,通过预先定义属性,您将在访问字段时阻止__get()被调用.因此,这不是一个选择.