Activerecord yii2按关系列获取活动记录

Activerecord yii2按关系列获取活动记录,activerecord,yii2,yii2-advanced-app,yii2-model,Activerecord,Yii2,Yii2 Advanced App,Yii2 Model,我需要选择具有与特定列值相关的AR的ActiveRecord 情况:“用户”可能有许多“分支”-通过连接表,分支与部门相关。我有department\u id,我想选择从这个部门拥有分支机构的用户 部门: ... $this->hasMany(Branch::className(), ['department_id' => 'id']); 分支机构: ... $this->hasMany(User::className(), ['id' => 'user_id'])

我需要选择具有与特定列值相关的AR的ActiveRecord

情况:“用户”可能有许多“分支”-通过连接表,分支与部门相关。我有
department\u id
,我想选择从这个部门拥有分支机构的用户

部门:

... $this->hasMany(Branch::className(), ['department_id' => 'id']);
分支机构:

... $this->hasMany(User::className(), ['id' => 'user_id'])
                ->viaTable('{{%user_to_branch}}',['branch_id' => 'id']);
问题是,我不想以任何方式(例如,
$Department->getUsers()
…)从部门访问它,但我想在
ActiveQuery
中定义它

因此,我可以选择以下用户:

User::find()->fromDepartment(5)->all();
提前谢谢你

在ActiveRecord中:

/**
 * @inheritdoc
 * @return MyActiveRecordModelQuery the active query used by this AR class.
 */
public static function find()
{
    return new MyActiveRecordModelQuery(get_called_class());
}
MyActiveRecordModelQuery:

/**
 * @method MyActiveRecordModelQuery one($db = null)
 * @method MyActiveRecordModelQuery[] all($db = null)
 */
class MyActiveRecordModelQuery extends ActiveQuery
{
    /**
     * @return $this
     */
    public function fromDepartment($id)
    {
        $this->andWhere(['departament_id' => $id]); //or use relation

        return $this;
    }
}
用法:

MyActiveRecordModelQuery::find()->fromDepartment(5)->all();
User::fromDepartment(5);

用户模型方法

public function getBranch()
{
    return $this->hasMany(Branch::className(), ['id' => 'branch_id'])
                ->viaTable('{{%user_to_branch}}', ['user_id' => 'id']);
}

public static function fromDepartment($id)
{
    $query = self::find();
    $query->joinWith(['branch'])
          ->andWhere(['department_id'=>$id]);
    return $query->all();
}
用法:

MyActiveRecordModelQuery::find()->fromDepartment(5)->all();
User::fromDepartment(5);

谢谢,但是,我假设
MyActiveRecordModelQuery
是针对我的
部门
模型的,但是这样我们选择的是部门,而不是用户:|当然!这对我来说太棒了。谢谢我在ActiveQuery中使用了它,比如:用户模型:
public static function find(){$q=new UserQuery(get_called_class());return$q->userDepartment(\Yii::$app->User->identity->department_id)->orderBy('namel ASC');}
和ActiveQuery:
classuserquery extensed\Yii\db\ActiveQuery{public function userDepartment($departmentId){return$this->joinWith(['branchs'])->andWhere(['department\u id'=>$departmentId]);}