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()