一、在标签tags的model中
//使用正则表达式,把标签字符串转换成数组 public static function string2array($tags) { return preg_split('/s*,s*/',trim($tags),-1,PREG_SPLIT_NO_EMPTY); } //把数组转换成字符串 public static function array2string($tags) { return implode(', ',$tags); } //处理需要新增的标签 public static function addTags($tags) { if(empty($tags)) return ; foreach ($tags as $name) { $aTag = Tag::find()->where(['name'=>$name])->one(); $aTagCount = Tag::find()->where(['name'=>$name])->count(); if(!$aTagCount) { $tag = new Tag; $tag->name = $name; $tag->frequency = 1; $tag->save(); } else { $aTag->frequency += 1; $aTag->save(); } } } //处理需要删除的标签 public static function removeTags($tags) { if(empty($tags)) return ; foreach($tags as $name) { $aTag = Tag::find()->where(['name'=>$name])->one(); $aTagCount = Tag::find()->where(['name'=>$name])->count(); if($aTagCount) { if($aTagCount && $aTag->frequency<=1) { $aTag->delete(); } else { $aTag->frequency -= 1; $aTag->save(); } } } } //更新标签 public static function updateFrequency($oldTags,$newTags) { if(!empty($oldTags) || !empty($newTags)) { $oldTagsArray = self::string2array($oldTags); $newTagsArray = self::string2array($newTags); self::addTags(array_values(array_diff($newTagsArray,$oldTagsArray))); self::removeTags(array_values(array_diff($oldTagsArray,$newTagsArray))); } }
二、标签model的使用位置分析
在post的model中
class Post extends yiidbActiveRecord { private $_oldTags; public function afterFind() { parent::afterFind(); $this->_oldTags = $this->tags; } public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); Tag::updateFrequency($this->_oldTags, $this->tags); } public function afterDelete() { parent::afterDelete(); Tag::updateFrequency($this->tags, ''); }