web-dev-qa-db-ja.com

PHPStormがLaravel 5.0のModelクラスのメソッドを認識しない

データベースへのデータの挿入に失敗し、すべてのクエリクラスとモデルクラスのメソッドが見つかりません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;
    }


}
21

Eloquentメソッドを認識するようにModelを拡張するクラスが必要な場合は、クラスの上部のPHPDocコメントに以下を追加するだけです。

@mixin Eloquent

例:

<?php namespace App;

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

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

注:ほとんどの人はおそらくLaravelに ide-helper を使用しているため、これは@mixin属性は、モデルクラスに対して自動的に生成されます。

38
Tomáš Staník

wherelatestfindfindOrFailなどのメソッドはModelクラスには存在しませんが、Builderには存在せず、マジックメソッドを介してロードされるため、IDEはこれらを検出できません。

広く提案されている laravel-ide-helper は素晴らしいですが、[役に立たない」も役立ちます。複数の issues および discussions と件名の回避策がありますが、すべて独自の問題があります。

私がこれまでに見つけた最善の解決策は、IMHOがクラスに__magicメソッドが存在する場合は重大度を下げるにすることです。 PhpStormには、検査設定でこの正確なオプションがあります。

_Settings -> Inspections -> PHP -> Undefined -> Undefined method_をチェックインします。これにより、メソッドをクリックすることはできませんが、迷惑なマークアップを無効にするだけです。 重大度の詳細を読む またはこれを確認 より表現力豊かSO回答

26
ruuter

ソリューションのためにここに来た人にとって、私のために働いたのはこのStackOverflowのソリューションです:

PhpStorm laravel 5メソッドが見つかりません

特に私が走ったとき:

編集:このコマンドを使用するには、インストールする必要がある ide-helper を実行します。

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

...

php artisan ide-helper:models

「はい」と答えました

その後、メソッドが認識されます。

14
Amr El Massry

私のクラス。注釈は、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',
    ];
}
8
Patrioticcow

バリーの_ide_help.phpソリューションを試した後、私は機能し、シンプルなソリューションを見つけました。解決策を示すララキャストビデオ: https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15 -最初のコメントの下に、バリーのリンクがあります。

これを追加した後、私にはうまくいきませんでしたが、完成のためにまだ言及しています。

それから私はこれを試しました:

私のモデルでは、上部にuse Eloquent;を追加しました。 (入力の代わりにオートコンプリートを使用してEloquentを追加しました)。

次に、クラスの上に「/ ** hit ENTER」と入力すると、自動的に生成されましたPHP新しく生成されたドキュメントPHP追加したドキュメント@mixin Eloquent down未満。

最後のステップとして、私は Ctrl+Alt+Y (デフォルト設定)これは、PhpStormで同期(ファイル->同期)します。

これで警告が修正され、コントローラーの:: findメソッドが見つかり、自動補完が機能していました。

例として私のクラスの下に:

namespace App;

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


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

}
3
xrayin

すべてのモデルに追加するのは少し面倒ですが、モデルのdocblockにメソッドを追加できます。これにより、PHPStormで正しく動作します。

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

あなたは付け加えられます @mixin QueryBuilderModelクラスのphpdocに

ファイルパス : project_path\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

2
MH.Kashizadeh

私はlaravelに不慣れで、モデルとphpstormに関するこのすべての問題は非常に奇妙です。これは大きな欠点です。@ mixin Eloquentの追加やphp artisan ide-helper:modelsの実行などの解決策はありませんでしたPHPStormはEloquentまたは\ Eloquentを検出しません。ide-helper:modelsは、使用可能なすべての静的メソッドを追加するわけではないため、関連するすべてのモデルメソッドを含むphp docを含む独自のベースモデルを用意しました。

<?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は完全ではなくなりました。静的メソッドを追加してもかまいません。必要に応じて追加します。

2
Rawburner

この質問に「回答」できるようにするには、laravel ide-helper。に従ってください これらの手順 を実行すると、すべてがうまくいくはずです。

0
Dylan Buth

同意して+1 @ rutter。私はLaravelプロジェクトに集中しているので、この問題は常に私の顔にあります。

BarryのLaravel-IDE Gitは「ステープル」メソッドに最適です。すべての問題を実際にキャプチャすることはできません。これは、Laravelのベンダーパッケージスコープ(後で他のクラス/メソッドを通じて呼び出されます)で頻繁に発生します。

私はそこにボールを投げていますが、intelliJが(設定された後)マジックメソッドの設定を試行/キャッチできるコンパイラを作成する場合ボタンを1回押すだけで(ブール値を返し、成功した場合、メソッドへのルート)まあ...それは素晴らしいでしょう。

重大度をオフにすることはそれを処理するためのクールな方法です(上記で詳述)が、メソッドへの簡単なショートカットがないか、またはそれが存在することを通知することさえせずに立ち往生しています。

建設的には、同期ボタンが何か(更新以外)を意味するようにすることをお勧めします。

0
clusterBuddy

私はこのように解決しました。

IDEのサポートLaravel Baryvdhからの出荷:

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

インストールした後、コンソールで呼び出すだけです:

php artisan ide-helper:generate

_ide_helper.phpファイルにすべてのfacedeショートカットを生成します(gitから除外する必要があります)

PhpStormには特別なものもあります:

php artisan ide-helper:meta