Yii2: можно ли добавить свой метод в ActiveRecord?
У меня есть класс User. Когда я хочу выбрать все пользователей, я делаю запрос
User::find()->all()
Когда надо добавить условие - добавляю where. Но, например, мне надо много где использовать 3-4 одинаковых условий
User::find()->where(['status' => 1, 'rating' => 0, 'balance' => 0])
Я хотел бы иметь некий метод selectNewUser() который смог бы вызвать так
User::find()->selectNewUser()->all()
Это реально? Не могу нагуглить информацию
Ответы (1 шт):
Да, можно с помощью ActiveQuery. Инфу можно почитать тут https://yiiframework.com.ua/ru/doc/guide/2/db-active-record/#customizing-query-classes
Также сразу оговорюсь, что эти классы можно генерировать в gii при генерировании модели:
Как добиться:
Создаётся отдельный класс, унаследованный от
ActiveQuery. Обычно они все лежат в папке и в неймспейсеapp\models\query;В классе выше необходимо переопределить два метода
oneиall/** * Данный класс ActiveQuery является надстройкой для основного [[\app\models\Comment]]. */ class CommentQuery extends ActiveQuery { /** * @inheritdoc * * @return \app\models\Comment[]|array */ public function all($db = null) { return parent::all($db); } /** * @inheritdoc * * @return \app\models\Comment|array|null */ public function one($db = null) { return parent::one($db); } }В основной модели надо сделать ссылку на модель
ActiveQuery:/** * @inheritdoc * * @return \app\models\query\CommentQuery the active query использующаяся для данного класса AR. */ public static function find() { return new \app\models\query\CommentQuery(get_called_class()); }Теперь в классе
ActiveQueryможно писать доп. методыpublic function active($state = true) { return $this->andWhere(['active' => $state]); }Этот метод будет выбирать только активных или только неактивных пользователей.
Применение:
$comments = Comment::find()->active()->all(); $inactiveComments = Comment::find()->active(false)->all();
В вашем случае метод может быть таким:
public function activeWithZeroBalanceAndRating() {
return $this->andWhere(['status' => 1, 'rating' => 0, 'balance' => 0]);
}
И использование:
$activeUsersWIthZeorBalanceAndRating = User::find()->activeWithZeroBalanceAndRating()->all();
Конечно, если нужно, то можно сделать метод с параметрами и передавать данные туда, как в примерах выше.
