我使用Laravel和eclipse作为我的IDE。我正在使用laravel-ide帮助程序包进行自动完成。
我从一个雄辩的模型对象调用方法。
当我输入时
User::find
eclipse为我提供了:
find($id,$columns(:\Illuminate\Database\Eloquent\Model。
这意味着"find"方法返回一个\Illuminate\Database\Eloquent\Model实例。
但是,当我输入时
User::where
eclipse为我提供了以下内容:
where($column, $operator, $value, $boolean) : $this
这意味着函数"where"返回
$this
现在,我真的不知道$this是什么意思,因为据我所知,"where"应该返回一个查询生成器实例。据我所知,$this意味着方法的对象调用方(在本文中,是User模型本身(。但它显然没有返回模型。我怀疑我不明白$在这种情况下意味着什么。
我错过了什么?
find()
和where()
方法在Model类上不存在,因此对这些方法的调用最终会落入Laravel定义的PHP魔术方法__call()
。在这个神奇的方法中,Laravel将方法调用转发到一个新的查询生成器对象,确实有这些方法。
查询生成器类的find()
方法返回一个Model,其where()
方法返回对自身的引用($this(,这样您就可以流畅地将更多方法调用链接到生成器。
所有这些都会使IDE很难提供提示(IntelliSense(,而这正是laravel-IDE helper等包的用武之地。它们基本上会生成充满接口的文件,IDE可以使用这些文件来了解各种类的神奇方法和属性,但在某些情况下,这些方法签名仍然达不到您可能想要了解的代码结构。
在这种情况下,IntelliSense建议显然是从IlluminateDatabaseEloquentBuilder::where()
:的文档块中填充的
/**
* Add a basic where clause to the query.
*
* @param string|array|Closure $column
* @param mixed $operator
* @param mixed $value
* @param string $boolean
* @return $this
*/
public function where($column, $operator = null, $value = null, $boolean = 'and');
您可以看到返回类型被定义为$this
。在这一点上,一些IDE可能足够聪明,能够理解其含义并为该类的实例提供建议。然而,如果IDE正在解析的方法定义是由类似laravel-IDE-helper的包生成的,那么这可能会变得更加复杂。在这种情况下,它不仅取决于IDE的功能,还取决于帮助程序包的输出。
Eclipse的提示完全脱离源代码中的方法注释,因此,如果您查看Builder
的源代码,它是query()
的返回类型,它具有find
。。。
/**
* Find a model by its primary key.
*
* @param mixed $id
* @param array $columns
* @return IlluminateDatabaseEloquentModel|IlluminateDatabaseEloquentCollection|static[]|static|null
*/
public function find($id, $columns = ['*'])
对于where()
,它是…
/**
* Add a basic where clause to the query.
*
* @param string|Closure $column
* @param string $operator
* @param mixed $value
* @param string $boolean
* @return $this
*/
public function where($column, $operator = null, $value = null, $boolean = 'and')
{
由于它只能添加一个类型提示,因此它使用find()
中的第一个,即IlluminateDatabaseEloquentModel
,而where()
中的唯一选项是$this
。