, (*1)
Flexible yii2 behavior for tags., (*2)
Requirements
PHP 7, (*3)
Installation
composer require rkit/tags-behavior-yii2
Configuration
For example, we have a Post
model and we want to add tags.
Let's do it., (*4)
- Add
tag
and post_to_tag
tables and a Tag
model for the tags
$this->createTable('{{%tag}}', [
'id' => $this->primaryKey(),
'name' => $this->string()->notNull()->unique(),
'frequency' => $this->integer()->notNull()->defaultValue(0),
]);
$this->createTable('{{%post_to_tag}}', [
'post_id' => $this->integer()->notNull()->defaultValue(0),
'tag_id' => $this->integer()->notNull()->defaultValue(0),
]);
$this->addPrimaryKey('', '{{%post_to_tag}}', ['post_id', 'tag_id']);
- Add a
TagsBehavior
behavior to the Post
model
public function behaviors()
{
return [
'tagsBehavior' => [
'class' => 'rkit\tags\behavior\TagsBehavior',
'relation' => 'tags',
'tagAttribute' => 'name',
'tagFrequencyAttribute' => 'frequency', // or false
'findTag' => function ($value) {
return Tag::find()->where([$this->tagAttribute => $value])->one();
},
'createTag' => function ($value) {
$tag = new Tag();
$tag->{$this->tagAttribute} = $value;
return $tag;
},
],
];
}
- Add a
tags
relation (see relation
option in the behavior)
/**
* @return \yii\db\ActiveQuery
*/
public function getTags()
{
return $this
->hasMany(Tag::class, ['id' => 'tag_id'])
->viaTable('{{%post_to_tag}}', ['post_id' => 'id']);
}
Usage
$model = new Post();
$model->setTagValues(['example1', 'example2']);
$model->save();
$post = Post::find()->with('tags')->where(['id' => $id])->one();
$post->getTagValues();
$model = new Post();
$model->setTagValues([]);
$model->save();
Tests
Coding Standard