FAQ: Как заставить IDE автокомплитить scope методы в ActiveRecord Yii2 / Yii framework


В последнее время часто стали задавать вопрос — как же заставить IDE дополнять предустановленые в модели scope методы. Для начала посмотрим, как разработчики фреймворка предполагают работу со scopes.

Вкратце. В модели создается статический метод, который дергается классом ActiveQuery черезе магический метод __call. Но эти методы не подхватываются IDE (на примере PhpStorm 7).



Для поддержки автокомплита я придумал следующий хак.
Допустим есть модель User, создаем класс UserQuery унаследованый от ActiveQuery. В этом классе описываем scopes для модели User:

class UserQuery extends ActiveQuery
{
    /**
     * @return self
     */
    public function byId($id)
    {
        $this->andWhere(['id' => $id]);
        return $this;
    }
}

В модели User переопределяем методы createQuery и find:
class User extends ActiveRecord
{
    public static function createQuery()
    {
        return new UserQuery([
            'modelClass' => get_called_class()
        ]);
    }
 
    /**
     * @param mixed $q
     * @return UserQuery|User|null
     */
    public static function find($q = null)
    {
        return parent::find($q);
    }
}

Теперь IDE будет поддерживать автокомплит конструкций
User::find()->byId(1)->one();


Но
К сожалению, такие scope методы не будут работать с ActiveRelation. С методами hasOne и hasMany придется обходиться стандартными методами
$this->hasOne()->where()->order()->limit()