PHPStorm не распознает методы моего класса Model в Laravel 5.0

не удалось вставить данные в базу данных, и весь класс запросов и метод класса модели не найдены в среде IDE (phpStrom), как я могу ее решить?

вот мой расширенный класс (Post.php) здесь показывает ошибку в последнем и где метод:

<?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;
    }


}

Ответ 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 {

Примечание: Большинство из вас, вероятно, используют ide-helper для Laravel, поэтому этот атрибут @mixin автоматически создается для классов модели.

Ответ 2

Так как методы where, latest, find, findOrFail и другие не существуют в классе Model, но в Builder и загружаются с помощью магических методов, IDE не может их обнаружить.

В то время как широко предложенный laravel-ide-helper отличный, он не помогает. Существует несколько issues и обсуждения и обходные пути но все имеют свои проблемы.

Самое лучшее решение, которое я нашел до сих пор, IMHO - это понизить степень серьезности, если __magic методы присутствуют в классе. PhpStorm имеет эту точную опцию в настройках проверки.

Заезд Settings -> Inspections -> PHP -> Undefined -> Undefined method Это не позволит вам нажать на этот метод, но просто отключает раздражающую разметку. Узнайте больше о серьезности или проверьте этот более выразительный ответ SO <

Ответ 3

Для тех, кто пришел сюда за решением, у меня сработало решение в этом Кару:

Метод PhpStorm laravel 5 не найден

особенно когда я бежал:

Редактировать: чтобы использовать эту команду, вам нужно установить ide-helper, запустить:

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

...

php artisan ide-helper:models

и ответил "да"

после этого методы признаются.

Ответ 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',
    ];
}

Ответ 5

Немного раздражает, чтобы добавить ко всем вашим моделям, но вы можете добавить этот метод в свои модели docblock. Это заставит его работать правильно в PHPStorm.

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

Ответ 6

Я новичок в laravel, и все эти проблемы с моделями и phpstorm очень странные. Это большой недостаток. Такие решения, как добавление @mixin Eloquent или работающего php artisan ide-helper: модели не работали для меня. PHPStorm не находит "Красноречивый" или "Красноватый". ide-helper: модели не добавляют все полезные статические методы. Поэтому я пришел с собственной базовой моделью, которая содержит 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 value from the first result of a query.
 * @method mixed pluck($column) Get a single column 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 value by a given amount.
 * @method int decrement($column, $amount = 1, array $extra = []) Decrement a column 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 теперь не является полным, не стесняйтесь добавлять дополнительные статические методы, добавляя их по требованию.

Ответ 7

Вы можете добавить @mixin QueryBuilder в phpdoc Model Class

Путь к файлу: project_path\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php

Ответ 8

Я нашел решение, которое работало и было простым после того, как попробовал решение _ide_help.php Барри. Видео Laracast, показывающее решение: https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/15 - В первом комментарии вы можете найти ссылки Барри.

После того, как я добавил это, он не работал для меня, но я все еще упоминаю это для завершения.

Тогда я попробовал это:

В моей модели я добавил use Eloquent; вверху. (Я добавил Eloquent путем автоматического завершения вместо ввода).

Затем над своим классом я набрал "/** хит ENTER", который автоматически генерировал PHP документы в недавно сгенерированных документах PHP я добавил @mixin Eloquent внизу.

В качестве последнего шага я нажал Ctrl + Alt + Y (настройки по умолчанию), который синхронизируется (File-> Synchronize) в PhpStorm.

Это исправило предупреждения, и метод my :: find в моем контроллере был найден, и автозаполнение работало.

Например, ниже моего класса:

namespace App;

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


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

}

Ответ 9

Просто чтобы этот вопрос можно было "ответить", вам нужен laravel ide-helper. Следуйте этим инструкциям, и все должно работать на вас.

Ответ 10

Согласование и +1 @rutter. Я бы добавил, что эта проблема постоянно на моем лице, так как я концентрируюсь на проектах Laravel.

Barry Laravel-IDE Git отлично подходит для методов "сшивки", он не может действительно захватывать каждую проблему, это происходит много с областью пакета поставщика Laravel (который позже вызывается через другие классы/методы..)

Я бросаю мяч туда, но если intelliJ создаст компилятор, который сможет попробовать/поймать заданные магические методы (после их установки) только на одной кнопке нажмите (возврат bool и на успех маршрут к методу) хорошо... это было бы здорово.

Отключение серьезности - это классный способ справиться с этим (выработано выше), но вы все еще застряли без простого сочетания метода или даже даете знать, что он существует.

Конструктивно я бы предложил, чтобы они заставили эту кнопку синхронизации означать что-то (кроме обновления).