Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩模型中的场_Php_Laravel_Pdo_Eloquent - Fatal编程技术网

Php Laravel雄辩模型中的场

Php Laravel雄辩模型中的场,php,laravel,pdo,eloquent,Php,Laravel,Pdo,Eloquent,我是拉雷维尔的新手,口才很好,所以如果这是一个完全愚蠢的问题,请原谅。 我在文档和另一个教程(在使用雄辩的ORM创建模型一节)中一直在研究如何创建模型,我注意到表中的实际字段从未被提及,除非有一些特定的内容(比如与另一个表有关系,或者不需要大规模赋值,或者需要对JSON输出隐藏它们等等) 是否故意省略了这些字段,而PHP只是在启用了FETCH_OBJ的情况下使用PDO执行查询时添加这些字段? 如果是,为什么我们没有显式地将字段放在模型中?它是否有助于我们知道我们有哪些字段,以及诸如PHPStor

我是拉雷维尔的新手,口才很好,所以如果这是一个完全愚蠢的问题,请原谅。 我在文档和另一个教程(在使用雄辩的ORM创建模型一节)中一直在研究如何创建模型,我注意到表中的实际字段从未被提及,除非有一些特定的内容(比如与另一个表有关系,或者不需要大规模赋值,或者需要对JSON输出隐藏它们等等)

是否故意省略了这些字段,而PHP只是在启用了
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等不太智能的编辑器打开模型,它们还可以用来指示模型具有哪些魔法字段。感谢您的洞察力!那么我该如何知道模型的字段呢?