Отличное расширение для создания и управления тегами.
Установка
Здесь ничего нового, используем composer, добавляем строку:
"creocoder/yii2-taggable": "dev-master"
в раздел require файла composer.json приложения и выполняем команду:
composer update
или сразу выполняем команду:
php composer.phar require creocoder/yii2-taggable:dev-master
Настройка
Модифицируем модель подобным образом:
use creocoder\taggable\TaggableBehavior; /** * ... * @property string $tagNames */ class Post extends \yii\db\ActiveRecord { public function behaviors() { return [ TaggableBehavior::className(), ]; } public function rules() { return [ //... ['tagNames', 'safe'], ]; } public function transactions() { return [ self::SCENARIO_DEFAULT => self::OP_ALL, ]; } public static function find() { return new PostQuery(get_called_class()); } public function getTags() { return $this->hasMany(Tag::className(), ['id' => 'tag_id']) ->viaTable('post_tag_assn', ['post_id' => 'id']); } }
И класс query следующим образом:
use creocoder\taggable\TaggableQueryBehavior; class PostQuery extends \yii\db\ActiveQuery { public function behaviors() { return [ TaggableQueryBehavior::className(), ]; } }
Использование
Установка тегов записи
$post = new Post(); // Задание тегов строкой $post->tagNames = 'foo, bar, baz'; // Задание тегов массивом $post->tagNames = ['foo', 'bar', 'baz'];
Добавление тегов записи
$post = Post::findOne(1); // Добавление тегов строкой $post->addTagNames('bar, baz'); // Добавление тегов массивом $post->addTagNames(['bar', 'baz']);
Удаление тегов записи
$post = Post::findOne(1); // Удаление тегов строкой $post->removeTagNames('bar, baz'); // Удаление тегов массивом $post->removeTagNames(['bar', 'baz']);
Получение тегов записи
$posts = Post::find()->with('tags')->all(); foreach ($posts as $post) { echo $post->tagNames; }
Поиск записей по одному из тегов
Поиск по одному из тегов строкой $posts = Post::find()->anyTagNames('foo, bar')->all(); // Поиск по одному из тегов массивом $posts = Post::find()->anyTagNames(['foo', 'bar'])->all();
Поиск записей по всем тегам
Поиск по всем тегам строкой $posts = Post::find()->allTagNames('foo, bar')->all(); // Поиск по всем тегам массивом $posts = Post::find()->allTagNames(['foo', 'bar'])->all();