我正在使用Laravel和eclipse作为我的IDE。我正在使用laravel-ide-helper软件包进行自动补全。
我正在从一个雄辩的模型对象中调用方法。
当我输入
User::find
eclipse为我提供了:
发现($ id,$ columns):\ Illuminate \ Database \ Eloquent \ Model。
这意味着“查找”方法返回一个\ Illuminate \ Database \ Eloquent \ Model实例。
但是,当我输入
User::where
eclipse为我提供了以下内容:
where($column, $operator, $value, $boolean) : $this
这意味着函数“ where”返回
$this
现在,我真的不知道$这意味着什么,因为据我了解,“ where”应该返回查询生成器实例。据我所知,$ this表示方法的对象调用者(在此上下文中,User模型本身)。但这显然不会返回模型。我怀疑在这种情况下我不理解$这意味着什么。
我想念什么?
答案 0 :(得分:2)
Model类上没有find()
和where()
方法,因此对这些方法的调用最终落入了PHP魔术方法__call()
Laravel 已经定义的。在此魔术方法内部,Laravel将方法调用转发到新的查询构建器对象,该对象 具有这些方法。
查询构建器类的find()
方法返回模型,而其where()
方法返回对自身的引用($ this),以便您可以流畅地将更多方法调用链接到构建器。
所有这些都会使IDE很难提供提示(IntelliSense),这是laravel-ide-helper之类的程序包的进入位置。它们基本上生成充满接口的文件,您的IDE可以使用这些接口来了解什么魔术方法。和属性存在于各种类中,但是在某些情况下,这些方法签名仍未达到您可能希望了解的代码结构。
在这种情况下,显然\Illuminate\Database\Eloquent\Builder::where()
的文档块中出现了IntelliSense建议:
/**
* 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可能足够聪明,足以理解其含义并为该类的实例提供建议。但是,如果由laravel-ide-helper之类的包生成IDE解析的方法定义,则情况可能变得更加复杂。在这种情况下,它不仅取决于您的IDE的功能,还取决于帮助程序包的输出。
答案 1 :(得分:1)
Eclipse完全不使用源代码中的方法注释来获取提示,因此,如果您查看query()
的返回类型Builder
的源代码,则它具有{{1 }} ...
find
/**
* Find a model by its primary key.
*
* @param mixed $id
* @param array $columns
* @return \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection|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()
,而\Illuminate\Database\Eloquent\Model
中的唯一选项是where()
。