Php Laravel雄辩模型中的场
我是拉雷维尔的新手,口才很好,所以如果这是一个完全愚蠢的问题,请原谅。 我在文档和另一个教程(在使用雄辩的ORM创建模型一节)中一直在研究如何创建模型,我注意到表中的实际字段从未被提及,除非有一些特定的内容(比如与另一个表有关系,或者不需要大规模赋值,或者需要对JSON输出隐藏它们等等) 是否故意省略了这些字段,而PHP只是在启用了Php Laravel雄辩模型中的场,php,laravel,pdo,eloquent,Php,Laravel,Pdo,Eloquent,我是拉雷维尔的新手,口才很好,所以如果这是一个完全愚蠢的问题,请原谅。 我在文档和另一个教程(在使用雄辩的ORM创建模型一节)中一直在研究如何创建模型,我注意到表中的实际字段从未被提及,除非有一些特定的内容(比如与另一个表有关系,或者不需要大规模赋值,或者需要对JSON输出隐藏它们等等) 是否故意省略了这些字段,而PHP只是在启用了FETCH_OBJ的情况下使用PDO执行查询时添加这些字段? 如果是,为什么我们没有显式地将字段放在模型中?它是否有助于我们知道我们有哪些字段,以及诸如PHPStor
FETCH_OBJ
的情况下使用PDO执行查询时添加这些字段?
如果是,为什么我们没有显式地将字段放在模型中?它是否有助于我们知道我们有哪些字段,以及诸如PHPStorm之类的IDE来弹出正确的自动完成字段
如果确实需要它们,它们需要什么访问级别
谢谢。在雄辩的模型中,列名(字段)不是必需的。正如您所指出的,只需定义确定模型与其他模型之间关系的函数即可
由于您提到的原因,没有必要包含它们(Laravel执行选择*
,然后将所有返回的行作为公共属性添加到模型对象中)。这是一个称为水合的过程,您可以通过挖掘Laravel源代码准确地看到发生了什么。下面是所发生情况的摘要:
Users::find(123);
find()
从id=123的用户构造SELECT*查询,然后通过调用
first()
通过调用first()
通过调用设置要检索的列(*
,默认情况下)get()
使用的返回值返回getModels()
实际执行查询,然后调用返回的每一行newFromBuilder()
创建模型的新实例,并通过调用setrawtattributes()
的性质,在模型中声明所有列名(字段)是完全可以的(只需确保它们是公共的)。不过,约定(对您来说也是合理的),则省略它们。此类声明应留待以后处理
在进一步检查源代码后,不可以事先声明字段。这是因为实际属性值存储在$attributes
属性中,然后通过magic方法\u get()访问
。这里的问题是,通过预先定义属性,可以防止在访问字段时调用\uu get()
。因此,这不是一个选项
但是,也有。还有另一种方法可以使phpstorm自动完成列名并避免警告
/**
* @property string $title Title of article
*/
class Article extends Eloquent
感谢您的详细回复。遗憾的是,我不能像PDO
fetchObject()那样使用它
在这里,我可以指定类名,它是我特定类的一个实例。事实上,我使用的是PhpStorm,而且使用phpdoc标记的提示似乎有效,因此这是适当IDE支持的一个很好的解决方法。如果您真的想要该功能,您可以将雄辩的
类分为子类,它实际上是Illuminate\Database\Eloquent\Model
,(在app/config/app.php
中查找别名数组,并确保为您的Eloquent子类将Eloquent
别名设置为正确的FQN)并定义setrawtattributes()
这样做,但这可能比仅使用phpdoc标记更复杂。是的,这将变得过于复杂,超出我试图实现的范围。我只想让事情保持干净和可维护。偏离标准方式太多也可能使我无法在这里查找解决方案或提问。phpdoc标记似乎很好,如果通过记事本++或Vi等不太智能的编辑器打开模型,它们还可以用来指示模型具有哪些魔法字段。感谢您的洞察力!那么我该如何知道模型的字段呢?