protected function getRelationCondition($relation, $value)
    {
        /** @var \yii\db\ActiveRecord $relationClass */
        $relationClass = $relation->modelClass;
        if ($relation->via !== null) {
            /* @var $viaRelation \yii\db\ActiveQuery */
            $viaRelation = is_array($relation->via) ? $relation->via[1] : $relation->via;
            /** @var \yii\db\ActiveRecord $viaClass */
            $viaClass = $viaRelation->modelClass;
            $subquery = (new Query)
                ->select(array_map(function ($key) {
                    return 'j.' . $key;
                }, array_keys($viaRelation->link)))
                ->from(['t' => $relationClass::tableName()])
                ->innerJoin(['j' => $viaClass::tableName()], implode(' AND ', array_map(function ($leftKey, $rightKey) {
                    return 't.' . $leftKey .' = j.' . $rightKey;
                }, array_keys($relation->link), array_values($relation->link))))
                ->where(['IN', array_map(function ($key) {
                    return 't.' . $key;
                }, $relationClass::primaryKey()), $value]);
            $linkKeys = array_values($viaRelation->link);
        } else {
            $subquery = (new Query)
                ->select(array_keys($relation->link))
                ->from(['t' => $relationClass::tableName()])
                ->where(['IN', array_map(function ($key) {
                    return 't.' . $key;
                }, $relationClass::primaryKey()), $value]);
            $linkKeys = array_values($relation->link);
        }
        return ['IN', array_map(function ($key) {
            return 't.' . $key;
        }, $linkKeys), $subquery];
    }
protected function getRelationCondition($relation, $value)
    {
        /** @var \yii\db\ActiveRecord $relationClass */
        $relationClass = $relation->modelClass;
        if ($relation->via !== null) {
            /* @var $viaRelation \yii\db\ActiveQuery */
            $viaRelation = is_array($relation->via) ? $relation->via[1] : $relation->via;
            /** @var \yii\db\ActiveRecord $viaClass */
            $viaClass = $viaRelation->modelClass;
            $subquery = (new Query)
                ->select(array_map(function ($key) {
                    return 'j.' . $key;
                }, array_keys($viaRelation->link)))
                ->from(['t' => $relationClass::tableName()])
                ->innerJoin(['j' => $viaClass::tableName()], implode(' AND ', array_map(function ($leftKey, $rightKey) {
                    return 't.' . $leftKey .' = j.' . $rightKey;
                }, array_keys($relation->link), array_values($relation->link))))
                ->where(['IN', array_map(function ($key) {
                    return 't.' . $key;
                }, $relationClass::primaryKey()), $value]);
            $linkKeys = array_values($viaRelation->link);
        } else {
            $subquery = (new Query)
                ->select(array_keys($relation->link))
                ->from(['t' => $relationClass::tableName()])
                ->where(['IN', array_map(function ($key) {
                    return 't.' . $key;
                }, $relationClass::primaryKey()), $value]);
            $linkKeys = array_values($relation->link);
        }
        return ['IN', array_map(function ($key) {
            return 't.' . $key;
        }, $linkKeys), $subquery];
    }
protected function getRelationCondition ( $ relation , $ value ) { /** @var \yii\db\ActiveRecord $relationClass */ $ relationClass = $ relation -> modelClass ; if ( $ relation -> via !== null ) { /* @var $viaRelation \yii\db\ActiveQuery */ $ viaRelation = is_array ( $ relation -> via ) ? $ relation -> via [ 1 ] : $ relation -> via ; /** @var \yii\db\ActiveRecord $viaClass */ $ viaClass = $ viaRelation -> modelClass ; $ subquery = ( new Query ) -> select ( array_map ( function ( $ key ) { return 'j.' . $ key ; } , array_keys ( $ viaRelation -> link ) ) ) -> from ( [ 't' => $ relationClass :: tableName ( ) ] ) -> innerJoin ( [ 'j' => $ viaClass :: tableName ( ) ] , implode ( ' AND ' , array_map ( function ( $ leftKey , $ rightKey ) { return 't.' . $ leftKey . ' = j.' . $ rightKey ; } , array_keys ( $ relation -> link ) , array_values ( $ relation -> link ) ) ) ) -> where ( [ 'IN' , array_map ( function ( $ key ) { return 't.' . $ key ; } , $ relationClass :: primaryKey ( ) ) , $ value ] ) ; $ linkKeys = array_values ( $ viaRelation -> link ) ; } else { $ subquery = ( new Query ) -> select ( array_keys ( $ relation -> link ) ) -> from ( [ 't' => $ relationClass :: tableName ( ) ] ) -> where ( [ 'IN' , array_map ( function ( $ key ) { return 't.' . $ key ; } , $ relationClass :: primaryKey ( ) ) , $ value ] ) ; $ linkKeys = array_values ( $ relation -> link ) ; } return [ 'IN' , array_map ( function ( $ key ) { return 't.' . $ key ; } , $ linkKeys ) , $ subquery ] ; }
Only hasMany relations should be ever marked as valid attributes.
@param \yii\db\ActiveQuery $relation
@param array $value
@return array an IN condition with a subquery
Only hasMany relations should be ever marked as valid attributes .