嗯,我在 Laravel Sail 中有一个使用 Docker 和 VS Code 的项目。例如,当我键入“User::where()”时,此“where”不会显示为自动完成建议。对于这个方法和其他 Eloquent 方法,你有解决方案吗?
我尝试安装几个 PHP 和 Laravel 扩展,但很多都给出了“我找不到 php 命令”的问题(我认为这是因为我处于 doket 环境中或在 Windows 上使用 WSL)或者根本没有安装解决问题。
TLDR: 如果您改为
User::query()->where()
,则可以使 IDE 的自动完成功能正常工作。
详情:
如果按照运行代码的运行时流程
User::where()
用户扩展了类
\Illuminate\Database\Eloquent\Model
这个类没有静态方法
where()
所以代码落在魔术方法上__callStatic()
public static function __callStatic($method, $parameters)
{
return (new static)->$method(...$parameters);
}
它试图调用非静态方法
where()
,但它不存在,所以它落在魔术方法上__call()
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement', 'incrementQuietly', 'decrementQuietly'])) {
return $this->$method(...$parameters);
}
if ($resolver = $this->relationResolver(static::class, $method)) {
return $resolver($this);
}
if (Str::startsWith($method, 'through') &&
method_exists($this, $relationMethod = Str::of($method)->after('through')->lcfirst()->toString())) {
return $this->through($relationMethod);
}
return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}
最终运行
$this->forwardCallTo($this->newQuery(), $method, $parameters)
方法
newQuery()
返回一个\Illuminate\Database\Eloquent\Builder
,其中包含非静态方法where()
,一切都从这里继续。
雄辩模型中存在一个静态方法,它会跳过所有魔术方法并返回一个构建器。
public static function query()
{
return (new static)->newQuery();
}
因此,为了让您的 IDE 了解您正在使用构建器,请首先使用代码
User::query()
,您将获得提示并自动完成