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 и на успех маршрут к методу) хорошо... это было бы здорово.
Отключение серьезности - это классный способ справиться с этим (выработано выше), но вы все еще застряли без простого сочетания метода или даже даете знать, что он существует.
Конструктивно я бы предложил, чтобы они заставили эту кнопку синхронизации означать что-то (кроме обновления).