php - Laravel Eloquent 模型中的字段

标签 php laravel pdo eloquent

我是 Laravel 和 Eloquent 的新手,所以如果这是一个完全愚蠢的问题,请原谅。 我一直在研究如何在文档 here 中创建模型还有另一个教程 here (在使用 Eloquent ORM 创建模型部分)并且我注意到表的实际字段从未被提及,除非它们有特定的内容(例如与另一个表有关系,或者不需要批量分配,或者如果它们需要从 JSON 输出等中隐藏。)

这些字段是否被故意省略,而 PHP 在启用 FETCH_OBJ 的情况下使用 PDO 执行查询时只是添加它们? 如果是的话,为什么我们没有明确地将字段放入模型中?难道它不能帮助我们了解我们有哪些字段,以及 PHPStorm 等 IDE 弹出正确的自动完成字段吗?

如果确实需要它们,那么它们需要具有什么访问级别?

谢谢。

最佳答案

Eloquent 模型中不需要列名称(字段)。正如您所指出的,只需要定义确定模型与其他模型之间关系的函数即可。

由于您提到的原因,没有必要包含它们(Laravel 执行 select * ,然后将所有返回的行作为公共(public)属性添加到模型对象中)。这是一个被称为“水合作用”的过程,您可以通过深入研究 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()通过调用 * 设置要检索的列(默认为 Illuminate\Database\Eloquent\Builder::get()) .
  6. get()返回 Illuminate\Database\Eloquent\Collection 通过使用 Illuminate\Database\Eloquent\Builder::getModels() 的返回值
  7. getModels()实际上执行查询然后调用 Illuminate\Database\Eloquent\Model::newFromBuilder() 对于返回的每一行
  8. newFromBuilder()创建模型的新实例并通过调用 Illuminate\Database\Eloquent\Model::setRawAttributes() 设置列(字段)

我省略了一些不相关的事情,例如急切加载以简化过程,但这基本上是每个查询发生的情况。

您说得很好,提前了解字段有助于自动完成。 由于 setRawAttributes() 的性质声明模型中的所有列名称(字段)是完全可以的(只需确保它们是公共(public)的)。不过,惯例(为了你的理智)是忽略它们。此类声明应留给 migration files .

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

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

关于php - Laravel Eloquent 模型中的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26111283/

相关文章:

php - 高级时间戳计算(偶数行和奇数行总计)

Javascript getElementsByName 在 PHP 循环中不起作用

php - SQL 查询产生 SQL 异常,但在 DBMS 中运行它却没有错误?

链接到辅助表的插入/更新查询的 MYSQL 语法错误

PHP PostgreSQL 数组到字符串

PHP { } 和 {{ }} 有什么区别

php - Seeder 第一次运行良好,但在 Laravel 5 的后续循环中不执行某些任务?

php - 错误:调用未定义的方法Tests\Unit\SomeTest::assertStatus()

php - 为什么 PDO query() 结果的键包含表名?

php - 完整日历未更新到数据库