Отличное расширение для создания и управления тегами.
Установка
Здесь ничего нового, используем 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();