public function save()
{
$EavModel = $this->attributeHandler->owner;
$attribute = $this->attributeHandler->getAttributeName();
/** @var ActiveRecord $valueClass */
$valueClass = $EavModel->valueClass;
$baseQuery = $valueClass::find()->where(['entityId' => $EavModel->entityModel->getPrimaryKey(), 'attributeId' => $this->attributeHandler->attributeModel->getPrimaryKey()]);
$allOptions = [];
foreach ($this->attributeHandler->attributeModel->eavOptions as $option) {
$allOptions[] = $option->getPrimaryKey();
}
$query = clone $baseQuery;
$query->andWhere("optionId NOT IN (:options)");
$valueClass::deleteAll($query->where, ['options' => implode(',', $allOptions)]);
// then we delete unselected options
$selectedOptions = $EavModel->attributes[$attribute];
if (!is_array($selectedOptions)) {
$selectedOptions = [];
}
$deleteOptions = array_diff($allOptions, $selectedOptions);
$query = clone $baseQuery;
$query->andWhere("optionId IN (:options)");
$valueClass::deleteAll($query->where, ['options' => implode(',', $deleteOptions)]);
// third we insert missing options
foreach ($selectedOptions as $id) {
$query = clone $baseQuery;
$query->andWhere(['optionId' => $id]);
$valueModel = $query->one();
if (!$valueModel instanceof ActiveRecord) {
/** @var ActiveRecord $valueModel */
$valueModel = new $valueClass();
$valueModel->entityId = $EavModel->entityModel->getPrimaryKey();
$valueModel->attributeId = $this->attributeHandler->attributeModel->getPrimaryKey();
$valueModel->optionId = $id;
if (!$valueModel->save()) {
throw new \Exception("Can't save value model");
}
}
}
}