framework/db/ActiveQuery.php
private function joinWithRelation($parent, $child, $joinType)
    {
        $via = $child->via;
        $child->via = null;
        if ($via instanceof self) {
            // via table
            $this->joinWithRelation($parent, $via, $joinType);
            $this->joinWithRelation($via, $child, $joinType);
            return;
        } elseif (is_array($via)) {
            // via relation
            $this->joinWithRelation($parent, $via[1], $joinType);
            $this->joinWithRelation($via[1], $child, $joinType);
            return;
        }

        list($parentTable, $parentAlias) = $parent->getTableNameAndAlias();
        list($childTable, $childAlias) = $child->getTableNameAndAlias();

        if (!empty($child->link)) {
            if (strpos($parentAlias, '{{') === false) {
                $parentAlias = '{{' . $parentAlias . '}}';
            }
            if (strpos($childAlias, '{{') === false) {
                $childAlias = '{{' . $childAlias . '}}';
            }

            $on = [];
            foreach ($child->link as $childColumn => $parentColumn) {
                $on[] = "$parentAlias.[[$parentColumn]] = $childAlias.[[$childColumn]]";
            }
            $on = implode(' AND ', $on);
            if (!empty($child->on)) {
                $on = ['and', $on, $child->on];
            }
        } else {
            $on = $child->on;
        }
        $this->join($joinType, empty($child->from) ? $childTable : $child->from, $on);

        if (!empty($child->where)) {
            $this->andWhere($child->where);
        }
        if (!empty($child->having)) {
            $this->andHaving($child->having);
        }
        if (!empty($child->orderBy)) {
            $this->addOrderBy($child->orderBy);
        }
        if (!empty($child->groupBy)) {
            $this->addGroupBy($child->groupBy);
        }
        if (!empty($child->params)) {
            $this->addParams($child->params);
        }
        if (!empty($child->join)) {
            foreach ($child->join as $join) {
                $this->join[] = $join;
            }
        }
        if (!empty($child->union)) {
            foreach ($child->union as $union) {
                $this->union[] = $union;
            }
        }
    }
private function joinWithRelation($parent, $child, $joinType)
    {
        $via = $child->via;
        $child->via = null;
        if ($via instanceof self) {
            // via table
            $this->joinWithRelation($parent, $via, $joinType);
            $this->joinWithRelation($via, $child, $joinType);
            return;
        } elseif (is_array($via)) {
            // via relation
            $this->joinWithRelation($parent, $via[1], $joinType);
            $this->joinWithRelation($via[1], $child, $joinType);
            return;
        }

        list($parentTable, $parentAlias) = $parent->getTableNameAndAlias();
        list($childTable, $childAlias) = $child->getTableNameAndAlias();

        if (!empty($child->link)) {
            if (strpos($parentAlias, '{{') === false) {
                $parentAlias = '{{' . $parentAlias . '}}';
            }
            if (strpos($childAlias, '{{') === false) {
                $childAlias = '{{' . $childAlias . '}}';
            }

            $on = [];
            foreach ($child->link as $childColumn => $parentColumn) {
                $on[] = "$parentAlias.[[$parentColumn]] = $childAlias.[[$childColumn]]";
            }
            $on = implode(' AND ', $on);
            if (!empty($child->on)) {
                $on = ['and', $on, $child->on];
            }
        } else {
            $on = $child->on;
        }
        $this->join($joinType, empty($child->from) ? $childTable : $child->from, $on);

        if (!empty($child->where)) {
            $this->andWhere($child->where);
        }
        if (!empty($child->having)) {
            $this->andHaving($child->having);
        }
        if (!empty($child->orderBy)) {
            $this->addOrderBy($child->orderBy);
        }
        if (!empty($child->groupBy)) {
            $this->addGroupBy($child->groupBy);
        }
        if (!empty($child->params)) {
            $this->addParams($child->params);
        }
        if (!empty($child->join)) {
            foreach ($child->join as $join) {
                $this->join[] = $join;
            }
        }
        if (!empty($child->union)) {
            foreach ($child->union as $union) {
                $this->union[] = $union;
            }
        }
    }
private function joinWithRelation ( $ parent , $ child , $ joinType ) { $ via = $ child -> via ; $ child -> via = null ; if ( $ via instanceof self ) { // via table $ this -> joinWithRelation ( $ parent , $ via , $ joinType ) ; $ this -> joinWithRelation ( $ via , $ child , $ joinType ) ; return ; } elseif ( is_array ( $ via ) ) { // via relation $ this -> joinWithRelation ( $ parent , $ via [ 1 ] , $ joinType ) ; $ this -> joinWithRelation ( $ via [ 1 ] , $ child , $ joinType ) ; return ; } list ( $ parentTable , $ parentAlias ) = $ parent -> getTableNameAndAlias ( ) ; list ( $ childTable , $ childAlias ) = $ child -> getTableNameAndAlias ( ) ; if ( ! empty ( $ child -> link ) ) { if ( strpos ( $ parentAlias , '{{' ) === false ) { $ parentAlias = '{{' . $ parentAlias . '}}' ; } if ( strpos ( $ childAlias , '{{' ) === false ) { $ childAlias = '{{' . $ childAlias . '}}' ; } $ on = [ ] ; foreach ( $ child -> link as $ childColumn => $ parentColumn ) { $ on [ ] = "$parentAlias.[[$parentColumn]] = $childAlias.[[$childColumn]]" ; } $ on = implode ( ' AND ' , $ on ) ; if ( ! empty ( $ child -> on ) ) { $ on = [ 'and' , $ on , $ child -> on ] ; } } else { $ on = $ child -> on ; } $ this -> join ( $ joinType , empty ( $ child -> from ) ? $ childTable : $ child -> from , $ on ) ; if ( ! empty ( $ child -> where ) ) { $ this -> andWhere ( $ child -> where ) ; } if ( ! empty ( $ child -> having ) ) { $ this -> andHaving ( $ child -> having ) ; } if ( ! empty ( $ child -> orderBy ) ) { $ this -> addOrderBy ( $ child -> orderBy ) ; } if ( ! empty ( $ child -> groupBy ) ) { $ this -> addGroupBy ( $ child -> groupBy ) ; } if ( ! empty ( $ child -> params ) ) { $ this -> addParams ( $ child -> params ) ; } if ( ! empty ( $ child -> join ) ) { foreach ( $ child -> join as $ join ) { $ this -> join [ ] = $ join ; } } if ( ! empty ( $ child -> union ) ) { foreach ( $ child -> union as $ union ) { $ this -> union [ ] = $ union ; } } }
Joins a parent query with a child query.
The current query object will be modified accordingly.
@param ActiveQuery $parent
@param ActiveQuery $child
@param string $joinType
Joins a parent query with a child query . The current query object will be modified accordingly .