Search code examples
phplaraveleloquentphpstorm

Eloquent ORM Code Hinting in PhpStorm


So I'm just starting off with Laravel (using v5) and Eloquent. I'm working on getting some basic APIs up and running and noticing that a lot of working methods don't show up in PhpStorm's code hinting

So I have this model:

namespace Project\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model 
    implements AuthenticatableContract, CanResetPasswordContract {
}

And in one of my controllers I try to do

User::query()->orderBy('id', 'desc');

User::query() creates a Eloquent Builder object and orderBy() behave properly and without error. However, PhpStorm does not show orderBy() (or take(), skip(), and I'm sure others) when I type User::query()-> and gives warnings when I actually do use it.

I am using Laravel IDE Helper which has helped immensely with bringing code hints to the Facades, but not to the models/builders it would seem.

Does anyone have a solution to this?


Solution

  • For future Googlers, and perhaps OP as well if you are still sticking to Laravel.

    The laravel-ide-helper package solves this issue for you quite elegantly, with what I believe is a relatively new feature; generated model PHPDocs.

    You can generate a separate file for all PHPDocs with this command:

    php artisan ide-helper:models
    

    The generated metadata will look something like this for each class:

    namespace App {
    /**
     * App\Post
     *
     * @property integer $id
     * @property integer $author_id
     * @property string $title
     * @property string $text
     * @property \Carbon\Carbon $created_at
     * @property \Carbon\Carbon $updated_at
     * @property-read \User $author
     * @property-read \Illuminate\Database\Eloquent\Collection|\Comment[] $comments
     */
    class Post {}
    }
    

    This caused issues for me in PHPStorm however, where the software was complaining about multiple class definitions. Luckily an option is readily available for writing directly to the model files:

    php artisan ide-helper:models -W
    

    There are a few more options and settings available if you need to tweak the behavior, but this is the gist of it.