Пример #1
0
 /**
  * Приивязывает теги к элементам
  * @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();
     }
 }
Пример #2
0
 /**
  * @return EventQuery
  */
 public function getTags()
 {
     return $this->hasMany(Tag::className(), ['id' => 'tag_id'])->indexBy('id')->viaTable(TagEvent::tableName(), ['event_id' => 'id']);
 }