Расширение ActiveQuery


Вместо обычной ActiveQuery для класса можно определять свой класс запросов,
в котором выносить в методы основные способы получения данных:

namespace app\models;

use yii\db\ActiveRecord;
use yii\db\ActiveQuery;

class Comment extends ActiveRecord
{
    public static function find()
    {
        return new CommentQuery(get_called_class());
    }
}

class CommentQuery extends ActiveQuery
{
    public function active($state = true)
    {
        return $this->andWhere(['active' => $state]);
    }
}

Пример использования

class Customer extends \yii\db\ActiveRecord
{
    public function getActiveComments()
    {
        return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
    }
}

$comments = Comment::find()->active()->all();

$inactiveComments = Comment::find()->active(false)->all();

$customers = Customer::find()->with('activeComments')->all();

// или по-другому:

$customers = Customer::find()->with([
    'comments' => function($q) {
        $q->active();
    }
])->all();