laravel model 的查询构造器 XXModel::where() 编辑器不给提示?

1、用 Users::where 不给提示,也不提示参数、无法跳转:

laravel model 的查询构造器 XXModel::where() 编辑器不给提示?

2、用 DB::table()->where()就有提示:

laravel model 的查询构造器 XXModel::where() 编辑器不给提示?

怎么才能让1和2一样?

官方文档明摆着写着:

laravel model 的查询构造器 XXModel::where() 编辑器不给提示?

却不给个 api 提示?

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

首先需要了解一下概念,明白为啥没有提示:

1.Facade里面甚至没有方法,那为什么能够可以直接通过 DB::table() 方式直接调用table方法呢?

因为有注解:

/**
 * @method static \Illuminate\Database\Query\Builder table(string $table)
 * @see \Illuminate\Database\DatabaseManager
 * @see \Illuminate\Database\Connection
 */
class DB extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'db';
    }
}

可以通过注解提供代码提示能力

2.那为什么可以这样调用 DB::table()->where() 的时候就有代码提示了呢?

因为 DB::table() 返回了一个实例,实例调用方法肯定会有代码提示的~除非是通过 __call() 等类似魔术方法调用的方式,才不会主动有代码提示。

3.那为什么 User::where() 没有代码提示,却又能调用成功呢?

没有代码提示的原因已经很明显了,User类中既没有该静态方法,也没有类注解,自然不会有代码提示。

那为什么能调用成功呢?文档已经很明确的说明,每个Eloquent模型都可以充当一个查询构造器,我们也经常能看到 $model::query()$model->newQuery() 或者 $model->newModelQuery() 的写法。既然User类中没有该静态方法,此时就应该看看User类或其祖先类中的 __callStatic() 方法是否有你想要的答案。 回到 Illuminate\Database\Eloquent\Model 类,有下面两个方法:

public static function __callStatic($method, $parameters)
{
   return (new static)->$method(...$parameters);
}

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
}
    // 关键之处!!!
    // 原本的User::xxx(),转换成了该模型的查询构造器的xxx()方法,也就是文档说的查询构造器中
    // 可用的方法,在Eloquent查询中可用的原因。如果xxx不是查询构造器中的方法,调用发生错误,
    // 告诉你查询构造器中没有xxx方法。
    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}

最后,怎么可以有代码提示,帮助快速开发呢?

1.建议多看文档和源码,多看一点点就能多了解一点点,让自己成为代码提示者

2.https://github.com/barryvdh/laravel-ide-helper 这是个好东西~,一键生成注解

希望我的回答可以帮助你~ :speak_no_evil:

3年前 评论
勇敢的心 3年前
Adachi 3年前
WhiteDragon 3年前
讨论数量: 4

首先需要了解一下概念,明白为啥没有提示:

1.Facade里面甚至没有方法,那为什么能够可以直接通过 DB::table() 方式直接调用table方法呢?

因为有注解:

/**
 * @method static \Illuminate\Database\Query\Builder table(string $table)
 * @see \Illuminate\Database\DatabaseManager
 * @see \Illuminate\Database\Connection
 */
class DB extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'db';
    }
}

可以通过注解提供代码提示能力

2.那为什么可以这样调用 DB::table()->where() 的时候就有代码提示了呢?

因为 DB::table() 返回了一个实例,实例调用方法肯定会有代码提示的~除非是通过 __call() 等类似魔术方法调用的方式,才不会主动有代码提示。

3.那为什么 User::where() 没有代码提示,却又能调用成功呢?

没有代码提示的原因已经很明显了,User类中既没有该静态方法,也没有类注解,自然不会有代码提示。

那为什么能调用成功呢?文档已经很明确的说明,每个Eloquent模型都可以充当一个查询构造器,我们也经常能看到 $model::query()$model->newQuery() 或者 $model->newModelQuery() 的写法。既然User类中没有该静态方法,此时就应该看看User类或其祖先类中的 __callStatic() 方法是否有你想要的答案。 回到 Illuminate\Database\Eloquent\Model 类,有下面两个方法:

public static function __callStatic($method, $parameters)
{
   return (new static)->$method(...$parameters);
}

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
}
    // 关键之处!!!
    // 原本的User::xxx(),转换成了该模型的查询构造器的xxx()方法,也就是文档说的查询构造器中
    // 可用的方法,在Eloquent查询中可用的原因。如果xxx不是查询构造器中的方法,调用发生错误,
    // 告诉你查询构造器中没有xxx方法。
    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}

最后,怎么可以有代码提示,帮助快速开发呢?

1.建议多看文档和源码,多看一点点就能多了解一点点,让自己成为代码提示者

2.https://github.com/barryvdh/laravel-ide-helper 这是个好东西~,一键生成注解

希望我的回答可以帮助你~ :speak_no_evil:

3年前 评论
勇敢的心 3年前
Adachi 3年前
WhiteDragon 3年前

首先需要了解一下概念,明白为啥没有提示:

1.Facade里面甚至没有方法,那为什么能够可以直接通过 DB::table() 方式直接调用table方法呢?

因为有注解:

/**
 * @method static \Illuminate\Database\Query\Builder table(string $table)
 * @see \Illuminate\Database\DatabaseManager
 * @see \Illuminate\Database\Connection
 */
class DB extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'db';
    }
}

可以通过注解提供代码提示能力

2.那为什么可以这样调用 DB::table()->where() 的时候就有代码提示了呢?

因为 DB::table() 返回了一个实例,实例调用方法肯定会有代码提示的~除非是通过 __call() 等类似魔术方法调用的方式,才不会主动有代码提示。

3.那为什么 User::where() 没有代码提示,却又能调用成功呢?

没有代码提示的原因已经很明显了,User类中既没有该静态方法,也没有类注解,自然不会有代码提示。

那为什么能调用成功呢?文档已经很明确的说明,每个Eloquent模型都可以充当一个查询构造器,我们也经常能看到 $model::query()$model->newQuery() 或者 $model->newModelQuery() 的写法。既然User类中没有该静态方法,此时就应该看看User类或其祖先类中的 __callStatic() 方法是否有你想要的答案。 回到 Illuminate\Database\Eloquent\Model 类,有下面两个方法:

public static function __callStatic($method, $parameters)
{
   return (new static)->$method(...$parameters);
}

public function __call($method, $parameters)
{
    if (in_array($method, ['increment', 'decrement'])) {
        return $this->$method(...$parameters);
}
    // 关键之处!!!
    // 原本的User::xxx(),转换成了该模型的查询构造器的xxx()方法,也就是文档说的查询构造器中
    // 可用的方法,在Eloquent查询中可用的原因。如果xxx不是查询构造器中的方法,调用发生错误,
    // 告诉你查询构造器中没有xxx方法。
    return $this->forwardCallTo($this->newQuery(), $method, $parameters);
}

最后,怎么可以有代码提示,帮助快速开发呢?

1.建议多看文档和源码,多看一点点就能多了解一点点,让自己成为代码提示者

2.https://github.com/barryvdh/laravel-ide-helper 这是个好东西~,一键生成注解

希望我的回答可以帮助你~ :speak_no_evil:

3年前 评论
勇敢的心 3年前
Adachi 3年前
WhiteDragon 3年前
Users::query()->where()
3年前 评论

User::where()

不是 Users,另外,phpstorm 下亲测可以提示

3年前 评论

/** @mixin \Illuminate\Database\Query\Builder */ 在model上加上这个注释就可以了,自己补充完整路径

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!