/** * Приивязывает теги к элементам * @param Event| $obj Связывает данные модели в БД с тегом, зависит от класса переданной модели * @param array [string] $tags Массив с тегами, * @return int * @throws \Exception * @throws \yii\db\Exception */ public static function bind($obj, array $tags) { /** * @var \common\models\Tag[] $existsTag */ $tagsS = static::filter($tags); $tags = []; foreach ($tagsS as $tag) { $tags[mb_strtolower($tag)] = $tag; } if (empty($tags)) { return false; } $existsTag = static::find()->where(['name' => array_values($tags)])->all(); if ($obj instanceof Event) { // если тэг привязываем к событию(в будущем возможно теги будем привязывать к другим сущностям) $updatedTag = []; $rows = []; //сначала записываем существующие теги foreach ($existsTag as $ex) { $updatedTag[] = $ex->id; unset($tags[mb_strtolower($ex->name)]); $rows[] = [$ex->id, $obj->id]; } foreach ($tags as $tag) { $tagModel = new static(['name' => $tag]); $tagModel->insert(); if ($tagModel->id) { $rows[] = [$tagModel->id, $obj->id]; } } if (!empty($updatedTag)) { Yii::$app->db->createCommand('UPDATE tag SET popularity=popularity+1 WHERE id IN (' . implode(',', $updatedTag) . ')')->execute(); } return Yii::$app->db->createCommand()->batchInsert(TagEvent::tableName(), ['tag_id', 'event_id'], $rows)->execute(); } }
/** * @return EventQuery */ public function getTags() { return $this->hasMany(Tag::className(), ['id' => 'tag_id'])->indexBy('id')->viaTable(TagEvent::tableName(), ['event_id' => 'id']); }