private function saveInternal() { parent::save(false); $this->unlinkAll('kategorii_slushatelej_rel', true); // user select foreach ($this->kategorii_slushatelej as $id) { /* @var $kat KategoriyaSlushatelya */ if ($kat = KategoriyaSlushatelya::findOne($id)) { $this->link('kategorii_slushatelej_rel', $kat); } } // user input if (isset($this->kategorii_slushatelej_input)) { foreach ($this->kategorii_slushatelej_input as $name) { $kat = new KategoriyaSlushatelya(); $kat->nazvanie = $name; $kat->save(); $this->link('kategorii_slushatelej_rel', $kat); } } //garbage-collect unused kategorii $unusedKats = KategoriyaSlushatelya::find()->select('kategoriya_slushatelya.id')->leftJoin('kategoriya_slushatelya_kursa', 'kategoriya_slushatelya.id = kategoriya_slushatelya_kursa.kategoriya_slushatelya')->where(['kategoriya_slushatelya_kursa.kategoriya_slushatelya' => null])->groupBy('kategoriya_slushatelya.id'); foreach ($unusedKats->asArray()->batch() as $rows) { KategoriyaSlushatelya::deleteAll(['id' => array_filter($rows)]); } return true; }