2014-09-30 41 views
13

我是新来的Laravel和雄辩的,所以原谅我,如果这是一个完全愚蠢的问题。 我一直在寻找如何创建一个模型,同时在文档here也(用雄辩的ORM部分在创建模型)和我另一个教程here已经注意到,表的实际字段都未曾提及,除非有(比如与另一个表有关系,或者不需要批量分配,或者如果他们需要隐藏JSON输出等)

这些字段被故意忽略,PHP只是在它添加它们时使用FETCH_OBJ开启PDO执行查询? 如果是,为什么我们没有明确地将这些字段放入模型中?这不是帮助我们了解我们拥有哪些领域,还有帮助我们知道诸如PHPStorm等IDE是否会弹出正确的自动完成字段?

如果他们实际需要,他们需要什么样的访问级别有哪些?

谢谢。

回答

16

列名(字段)用雄辩的模型是不需要的。正如您所指出的,只需要定义确定模型与其他模型之间关系的函数。

由于您提到的原因(Laravel执行select *,然后将所有返回的行作为公共属性添加到模型对象),没有必要包含它们。这是一个被称为水合作用的过程,您可以通过挖掘Laravel来源来查看究竟发生了什么。这里的内容做一个总结:

  1. 您的呼叫(例如),Users::find(123);
  2. Illuminate\Database\Eloquent\Model::find()电话Illuminate\Database\Eloquent\Builder::find()
  3. find()构建SELECT * FROM users WHERE id = 123查询,然后通过调用Illuminate\Database\Eloquent\Builder::first()
  4. first()增加LIMIT 1返回的第一个结果通过调用Illuminate\Database\Query\Builder::take()
  5. 然后first()将列设置为r etrieved(默认为*),致电Illuminate\Database\Eloquent\Builder::get()
  6. get()使用的Illuminate\Database\Eloquent\Builder::getModels()
  7. getModels()返回值实际执行的查询返回Illuminate\Database\Eloquent\Collection,然后调用Illuminate\Database\Eloquent\Model::newFromBuilder()返回的每个行
  8. newFromBuilder()创建模型的新实例,并通过调用设置列(字段) Illuminate\Database\Eloquent\Model::setRawAttributes()

我省略了一些无关的事情,如急于加载以简化流程,但基本上每个查询都会发生这种情况。

你提前了解这些字段对自动完成有帮助。 由于 setRawAttributes()的性质,在模型中声明所有列名称(字段)(确保它们是公共的)是完全可以的。尽管(并且为了你的理智),该公约将省略它们。这些声明应该留给 migration files

经过对源码的进一步检查,确定是而不是可以事先声明字段。这是因为实际属性值存储在$attributes属性中,然后通过魔术方法__get()访问。这里的麻烦是,通过事先定义属性,当访问字段时,将阻止__get()被调用。因此,这不是一种选择。

但是,有ways to hint to editors (like PhpStorm) about the existence of properties without explicitly defining them

+1

感谢您的详细回复。可惜我不能像PDO的'fetchObject()'那样使用它,我可以在其中指定类名并为我的特定类的实例提供水分。我实际上使用PhpStorm,并且似乎使用phpdoc标签的提示可以正常工作,所以它是适当的IDE支持的一个很好的解决方法。 – jbx 2014-10-01 01:29:13

+0

如果你真的想要这个功能,你可以继承'Eloquent'类,它实际上是'Illuminate \ Database \ Eloquent \ Model',(查看'app/config/app.php'中的别名数组,并确保将'Eloquent'别名设置为你的Eloquent子类的正确FQN)并定义'setRawAttributes()'的行为就像那样,但是使用phpdoc标签可能会更加复杂。 – 2014-10-01 04:58:02

+1

是的,它会变得过于复杂,超出了我想要实现的范围。我只想让事情变得清洁和可维护。偏离标准方式太多也可能使我处于一种无法在这里查找解决方案或提出问题的情况。 phpdoc标签看起来很好,如果通过像Notepad ++或Vi这样不太智能的编辑器打开它,它们也可以指示模型具有哪些魔术字段。感谢您的洞察! – jbx 2014-10-01 13:34:19