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();
}
});
}
}
}