PHPStorm 无法识别 Laravel 5.0 中我的 Model 类的方法 [重复]

Posted

技术标签:

【中文标题】PHPStorm 无法识别 Laravel 5.0 中我的 Model 类的方法 [重复]【英文标题】:PHPStorm is not recognizing methods of my Model class in Laravel 5.0 [duplicate] 【发布时间】:2015-10-28 02:03:21 【问题描述】:

向数据库插入数据失败,IDE(phpStrom)中找不到所有查询类和模型类的方法,我该如何解决?

这是我的扩展类(Post.php)在这里显示最新错误和 where 方法:

<?php namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class Post extends Model 

    protected  $fillable=[
        'title',
        'description',
        'location',
        'contact',
        'type',
        'published_at'
    ];
    protected $date=['published_at'];
    public function setPublishedAtAttribute($date)
    
        $this->attributes['published_at'] = Carbon::createFromFormat('Y-m-d', $date);
    

    /**
     * @param $query
     */
    public function scopePublished($query)
    
        $query->where('published_at', '<=', Carbon::now());
    

    public function scopeUnPublished($query)
    
        $query->where('published_at', '>=', Carbon::now());
    

    /**
     * An post is owned by a user.
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user()
        return $this->belongsTo('App\User');
    

 

这是我使用它的控制器类:

<?php namespace App\Http\Controllers;

use App\Http\Requests;

use App\Http\Requests\CreatePostRequest;
use App\Post;
use Request;
use Illuminate\Support\Facades\Auth;
use Session;

class PostsController extends Controller 

    //
    public function __construct()
    
        $this->middleware('auth');
    

    public function index()
    
        //return \Auth::user()->name;
        $posts = Post::latest('published_at')->published()->get();
        $latest= Post::latest()->first();
        return view('tolet.index', compact('posts','latest'));

    

    /**
     * @param Post $post
     * @return \Illuminate\View\View
     * @internal param Articles $article
     * @internal param Articles $articles
     */
    public function show(Post $post)
    

        return view('tolet.show', compact('post'));
    

    public function create()
    
        if (Auth::guest()) 
            return redirect('tolet.index');
        
        return view('tolet.create');
    

    /**
     * @param CreatePostRequest $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     */
    public function store(CreatePostRequest $request)
    
        //validation

        $this->createPost($request);


       // flash('Your tolet has been created!')->important();

        return redirect('tolet.index');
    

    /**
     * @param Post $post
     * @return \Illuminate\View\View
     * @internal param Articles $article
     */
    public function edit(Post $post)
    
        return view('tolet.edit', compact('post'));
    


    /**
     * @param Post $post
     * @param CreatePostRequest $request
     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
     * @internal param Articles $article
     * @internal param $id
     */
    public function update(Post $post, CreatePostRequest $request)
    
        $post->update($request->all());
        return redirect('tolet.index');
    

    /**
     * sync up the list of tags in the database
     *
     * @param Post $post
     */


    /**
     * save a new post
     *
     * @param CreatePostRequest $request
     * @return mixed
     */
    private function createPost(CreatePostRequest $request)
    
        $post = Auth::user()->posts()->create($request->all());

        return $post;
    



【问题讨论】:

找不到哪个方法?? 看看this。按照说明进行操作,它应该会被识别。 所以它只是在 PhpStorm 中给出了那个错误?代码运行正常吗? nope 代码不起作用 *** 中存在同样的问题。你可以从***.com/a/31760673/9229618找到答案 【参考方案1】:

如果您希望扩展 Model 的类能够识别 Eloquent 方法,只需在该类的顶部 PHPDoc 注释中添加以下内容:

@mixin Eloquent

例子:

<?php namespace App;

use Carbon\Carbon;
use Eloquent;
use Illuminate\Database\Eloquent\Model;

/**
 * Post
 *
 * @mixin Eloquent
 */
class Post extends Model 

编辑 Laravel 6+

use Illuminate\Database\Eloquent\Builder;

/**
 * @mixin Builder
 */

注意: 你们中的大多数人可能在 Laravel 中使用 ide-helper,因此这个 @mixin 属性是为模型类自动生成的。

【讨论】:

效果很好!怎么能把这个评论应用到我所有的模型上而不把它写在每个模型中?有可能吗? 尝试在父类中定义。如果不可能,您必须在每个模型类中定义它。 就我而言,我使用了@mixin Builder 并导入了Builder,就像use Illuminate\Database\Eloquent\Builder; 一样 在 Laravel 6/7 中你需要更具体:@mixin \Illuminate\Database\Eloquent\Builder 这并不能完全解决我的问题,因为它仍然无法识别静态方法:使用Post::where 给我以下检查警告:Non-static method 'where' should not be called statically, but the class has the '__magic' method. 【参考方案2】:

由于wherelatestfindfindOrFail等方法在Model类中不存在,但在Builder中并通过魔术方法加载,IDE无法检测到这些。

虽然广泛推荐的laravel-ide-helper 很棒,但它也无济于事。有多个issues 和discussions 和解决方法,但都有自己的问题。

到目前为止我找到的最佳解决方案,恕我直言,如果类中存在 __magic 方法,则降低严重性。 PhpStorm 在检查设置中有这个确切的选项。

签入Settings -&gt; Inspections -&gt; PHP -&gt; Undefined -&gt; Undefined method 这不会让您单击该方法,而只会禁用烦人的标记。 Read more about severities 或查看more expressive SO answer

【讨论】:

另一个选项是$model = (new ModelClass)-&gt;,将显示完全完成【参考方案3】:

对于任何来这里寻求解决方案的人来说,对我有用的是这个 *** 中的解决方案:

PhpStorm laravel 5 method not found

特别是当我跑步时:

编辑: 要使用此命令,您必须安装 ide-helper,运行:

composer require --dev barryvdh/laravel-ide-helper 

...

php artisan ide-helper:models

并回答“是”

在识别方法之后。

【讨论】:

不起作用。 php artisan 没有“ide-helper”类别。 @Jess 此答案假定您已将此库添加到您的项目中:github.com/barryvdh/laravel-ide-helper 这是真正“现金价值”的答案。我的 PHPStorm IDE 终于可以在 Laravel 上正常工作了。谢谢你! 仅供参考,Amr 的答案也适用于 Laravel 8! (至少它对我有用。)【参考方案4】:

我的班级。注释将帮助 PhpStorm 识别这些方法。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Query\Builder;

/**
 * @method static Builder where($column, $operator = null, $value = null, $boolean = 'and')
 * @method static Builder create(array $attributes = [])
 * @method public Builder update(array $values)
 */
class User extends Model

    protected $table    = 'users';
    protected $fillable = [
        'email',
        'name',
        'password',
    ];

【讨论】:

请在您的回答中添加更多详细信息和描述。 @YousefAltaf 我认为这是不言自明的 @YousefAltaf 没有理由不理解这一点 @Patrioticcow 不,不是。你做了什么?你改变了什么?这如何特别适用于 OP 问题?这里没有任何信息可以让我推断出我自己的代码,因为您还没有说明您的解决方案实际上做了什么。【参考方案5】:

我是 laravel 的新手,模型和 phpstorm 的所有这些问题都非常奇怪。这是一个很大的缺点。 添加@mixin Eloquent 或运行 php artisan ide-helper:models 等解决方案对我不起作用。 PHPStorm 找不到 Eloquent 或 \Eloquent。 ide-helper:models 不会添加所有可用的静态方法。 所以我提供了一个自己的基础模型,其中包含一个包含所有相关模型方法的 php 文档:

<?php

namespace App;

use Closure;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Contracts\Pagination\Paginator;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Model as EloquentModel;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Database\Query\Builder as QueryBuilder;

/**
 * Class BaseModel
 * @package App
 * @method EloquentModel|Collection|null static $this find($id, $columns = ['*']) Find a model by its primary key.
 * @method EloquentModel|EloquentBuilder|null first($columns = ['*']) Execute the query and get the first result.
 * @method EloquentModel|EloquentBuilder firstOrFail($columns = ['*']) Execute the query and get the first result or throw an exception.
 * @method Collection|EloquentBuilder[] get($columns = ['*']) Execute the query as a "select" statement.
 * @method mixed value($column) Get a single column's value from the first result of a query.
 * @method mixed pluck($column) Get a single column's value from the first result of a query.
 * @method void chunk($count, callable $callback) Chunk the results of the query.
 * @method \Illuminate\Support\Collection lists($column, $key = null) Get an array with the values of a given column.
 * @method LengthAwarePaginator paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) Paginate the given query.
 * @method Paginator simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page') Paginate the given query into a simple paginator.
 * @method int increment($column, $amount = 1, array $extra = []) Increment a column's value by a given amount.
 * @method int decrement($column, $amount = 1, array $extra = []) Decrement a column's value by a given amount.
 * @method void onDelete(Closure $callback) Register a replacement for the default delete function.
 * @method EloquentModel[] getModels($columns = ['*']) Get the hydrated models without eager loading.
 * @method array eagerLoadRelations(array $models) Eager load the relationships for the models.
 * @method array loadRelation(array $models, $name, Closure $constraints) Eagerly load the relationship on a set of models.
 * @method static EloquentBuilder where($column, $operator = null, $value = null, $boolean = 'and') Add a basic where clause to the query.
 * @method EloquentBuilder orWhere($column, $operator = null, $value = null) Add an "or where" clause to the query.
 * @method EloquentBuilder has($relation, $operator = '>=', $count = 1, $boolean = 'and', Closure $callback = null) Add a relationship count condition to the query.
 * @method static EloquentBuilder find($value)
 * @method static EloquentBuilder orderBy($column, $direction = 'asc')
 * @method static EloquentBuilder select($columns = ['*'])
 *
 *
 * @method static QueryBuilder whereRaw($sql, array $bindings = [])
 * @method static QueryBuilder whereBetween($column, array $values)
 * @method static QueryBuilder whereNotBetween($column, array $values)
 * @method static QueryBuilder whereNested(Closure $callback)
 * @method static QueryBuilder addNestedWhereQuery($query)
 * @method static QueryBuilder whereExists(Closure $callback)
 * @method static QueryBuilder whereNotExists(Closure $callback)
 * @method static QueryBuilder whereIn($column, $values)
 * @method static QueryBuilder whereNotIn($column, $values)
 * @method static QueryBuilder whereNull($column)
 * @method static QueryBuilder whereNotNull($column)
 * @method static QueryBuilder orWhereRaw($sql, array $bindings = [])
 * @method static QueryBuilder orWhereBetween($column, array $values)
 * @method static QueryBuilder orWhereNotBetween($column, array $values)
 * @method static QueryBuilder orWhereExists(Closure $callback)
 * @method static QueryBuilder orWhereNotExists(Closure $callback)
 * @method static QueryBuilder orWhereIn($column, $values)
 * @method static QueryBuilder orWhereNotIn($column, $values)
 * @method static QueryBuilder orWhereNull($column)
 * @method static QueryBuilder orWhereNotNull($column)
 * @method static QueryBuilder whereDate($column, $operator, $value)
 * @method static QueryBuilder whereDay($column, $operator, $value)
 * @method static QueryBuilder whereMonth($column, $operator, $value)
 * @method static QueryBuilder whereYear($column, $operator, $value)
 */
abstract class BaseModel extends Model



然后我自己的模型扩展了这个模型:

<?php

 namespace Modules\Shop\Entities;

 use App\BaseModel;


 class MyEntity extends BaseModel

然后一切正常。 BaseModel 现在还不完整,随意添加更多静态方法,我按需添加。

【讨论】:

这也是唯一对我有用的解决方案。因为我依靠自动完成来探索一个项目,而且我也是 Laravel 的新手,所以没有它是一个巨大的劣势。谢谢你张贴这个。我还在列表中添加了@method static QueryBuilder max($column) 当 mixin 解决方案不可接受时,这是一个很好的解决方案(我的情况)。这几乎就像教育 PHP。 :D【参考方案6】:

添加到所有模型中有点烦人,但您可以将方法添加到模型文档块中。这将使它在 PHPStorm 中正常工作。

/*
 * @method static \Illuminate\Database\Query\Builder|\App\MyModelName where($field, $value)
 */

【讨论】:

这个应该插在哪里? 哦,我明白了。需要高于班级【参考方案7】:

在尝试了 Barry 的 _ide_help.php 解决方案后,我找到了一个可行且简单的解决方案。 展示解决方案的 Laracast 视频:https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15 -- 在第一条评论下方,您可以找到 Barry 的链接。

添加后它对我不起作用,但为了完成我仍然提到它。

然后我尝试了这个:

在我的模型中,我在顶部添加了use Eloquent;。 (我通过自动完成而不是打字的方式添加了 Eloquent)。

然后在我的班级上方输入“/** hit ENTER”,它会自动生成 PHP Docs 在新生成的 PHP 文档中,我在下面添加了@mixin Eloquent

作为最后一步,我点击 Ctrl+Alt+Y (默认设置),这是 PhpStorm 中的同步(文件->同步) .

这修复了警告,并且在我的 Controller 中找到了我的 ::find 方法,并且自动完成工作正常。

下面以我的班级为例:

namespace App;

use Illuminate\Database\Eloquent\Model; <br>
use Eloquent;


/** 
 * Class Student
 * @package App 
 * @mixin Eloquent 
 */ 
class Student extends Model <br>



【讨论】:

谢谢。他们应该将其添加到由工匠 make:model 创建的模型样板中【参考方案8】:

Laravel 8.x:

在类注解中添加@mixin

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

/**
 * Post
 *
 * @mixin Builder
 */
class Post extends Model 

【讨论】:

不工作i.imgur.com/S1Ub9jX.png @Mwthreex 兄弟,您的对象类型错误。您需要 Event 但您通过了 Eloquent 构建器。主题是关于 IDE 助手不建议方法:) 在 Laravel 8 上验证,只需将 @mixin Builder 添加到 Illuminate\Database\Eloquent\Model.php 注释即可解决。 ```php // Illuminate\Database\Eloquent\Model.php /** * @mixin Builder */ 抽象类模型 不适合我【参考方案9】:

我已经这样解决了。

Baryvdh 为 Laravel 提供了更好的 IDE 支持:

https://github.com/barryvdh/laravel-ide-helper

安装后,您只需在控制台中调用:

php artisan ide-helper:generate

在 _ide_helper.php 文件中生成所有 facede 快捷方式(您必须从 git 中排除)

PhpStorm 也有一些特别之处:

php artisan ide-helper:meta

【讨论】:

Tnx alot.Work like a watch:)【参考方案10】:

我在不使用任何插件的情况下通过这种方法解决了这个问题: 只需在模型名称后使用 query() 例如:

Model_name::query()->select('column_name')->where('some_where')->get();

然后phpstorm就被认出来了!!

【讨论】:

你永远不应该改变你的编码方式只是为了在 IDE 上识别它:) @badraldeen 是的,你是对的,但这只是我对解决这个问题的痴迷;)【参考方案11】:

您可以将@mixin QueryBuilder添加到Model类的phpdoc中

文件路径:project_path\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

【讨论】:

【参考方案12】:

此处的所有解决方案均不适用于不建议或不方便修改供应商文件的封装模型。

ide-helper 的另一个工具是php artisan ide-helper:eloquent

这会将/** @mixin \Eloquent */ 直接写入vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php 文件。

这将为从 Model 扩展的任何模型排序问题。

虽然这确实写入了供应商文件,但它是易于管理的,并且只需要在更新 laravel 时再次执行。您可以在作曲家脚本中添加一行,以在每个开发作曲家安装时实现这一点(对团队有好处)。

【讨论】:

【参考方案13】:

为了可以“回答”这个问题,您需要 laravel ide-helper。关注these instructions,一切都应该适合你。

【讨论】:

OP 正在讨论 latestwhere 方法,这不会修复。检查我的答案。【参考方案14】:

同意并 +1 @rutter。我要补充一点,自从我专注于 Laravel 项目以来,这个问题一直在我面前。

Barry 的 Laravel-IDE Git 非常适合“主食”方法,它不能真正捕捉到所有问题,这在 Laravel 的供应商包范围中经常发生(稍后通过其他类/方法调用......)

我正在把球扔出去,但如果 intelliJ 将创建一个编译器,该编译器将能够尝试/捕获设置的魔法方法(在设置之后)只需按下一个按钮(返回一个布尔值,成功时通往该方法的路线)嗯......那太好了。

关闭严重性是一种很酷的处理方法(上文已详细说明),但您仍然无法使用该方法的简单快捷方式,甚至无法让您知道它的存在。

建设性地,我建议他们让同步按钮有意义(刷新除外)。

【讨论】:

以上是关于PHPStorm 无法识别 Laravel 5.0 中我的 Model 类的方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

PhpStorm 无法识别使用 webpack 别名导入的 Sass 文件

PHPstorm - 无法在blade.php 文件中设置断点

(win系统)phpstorm里边terminal无法识别php及composergit命令等

解决laravel环境在Ubuntu下使用php artisan 创建文件后无法在phpstorm中编辑的问题

Laravel 5.0 [PDOException] SQLSTATE[HY000]:一般错误:1215 无法添加外键约束

PHPStorm 无法解析绝对包含路径