skeeks\cms\behaviors\RelationalBehavior::saveRelations PHP Method

saveRelations() public method

public saveRelations ( $event )
    public function saveRelations($event)
    {
        /** @var ActiveRecord $model */
        $model = $event->sender;
        $relatedRecords = $model->getRelatedRecords();
        foreach ($relatedRecords as $relationName => $relationRecords) {
            $activeQuery = $model->getRelation($relationName);
            if (!empty($activeQuery->via)) {
                // works only for many-to-many relation
                /* @var $viaQuery ActiveQuery */
                if ($activeQuery->via instanceof ActiveQuery) {
                    $viaQuery = $activeQuery->via;
                } elseif (is_array($activeQuery->via)) {
                    $viaQuery = $activeQuery->via[1];
                } else {
                    throw new ErrorException(\Yii::t('skeeks/cms', 'Unknown via type'));
                }
                $junctionTable = reset($viaQuery->from);
                $primaryModelColumn = array_keys($viaQuery->link)[0];
                $relatedModelColumn = reset($activeQuery->link);
                $junctionRows = [];
                $relationPks = ArrayHelper::getColumn($relationRecords, array_keys($activeQuery->link)[0], false);
                $passedRecords = count($relationPks);
                $relationPks = array_filter($relationPks);
                $savedRecords = count($relationPks);
                if ($passedRecords != $savedRecords) {
                    throw new ErrorException(\Yii::t('skeeks/cms', 'All relation records must be saved'));
                }
                foreach ($relationPks as $relationPk) {
                    $junctionRows[] = [$model->primaryKey, $relationPk];
                }
                $model->getDb()->transaction(function () use($junctionTable, $primaryModelColumn, $relatedModelColumn, $junctionRows, $model) {
                    $db = $model->getDb();
                    $db->createCommand()->delete($junctionTable, [$primaryModelColumn => $model->primaryKey])->execute();
                    if (!empty($junctionRows)) {
                        $db->createCommand()->batchInsert($junctionTable, [$primaryModelColumn, $relatedModelColumn], $junctionRows)->execute();
                    }
                });
            }
        }
    }