Table des matières
功能说明
无限级别标签嵌套
标签名称规则说明
安装说明:
安装
安装和执行迁移
创建 Tag.php
加入 Taggable Trait
「标签状态」标示
「推荐标签」标示
重写 Util 类?
使用范例
标签事件
单元测试
Thanks
Maison développement back-end tutoriel php Laravel Taggable 为你的模型添加打标签功能

Laravel Taggable 为你的模型添加打标签功能

Jun 20, 2016 pm 12:28 PM

功能说明

使用最简便的方式,为你的数据模型提供强大「打标签」功能。

:gift: 项目地址: https://github.com/summerblue/laravel-taggable

本项目修改于 rtconner/laravel-tagging项目,增加了一下功能:

  • 标签名唯一;
  • 增加 etrepat/baum依赖,让标签支持无限级别标签嵌套;
  • 中文 slug 拼音自动生成支持,感谢超哥的 overtrue/pinyin;
  • 提供完整的测试用例,保证代码质量。

注意: 本项目只支持 5.1 LTS

:heart: 此项目由 The EST Group团队的 @Summer维护。

无限级别标签嵌套

集成 etrepat/baum让标签具备从属关系。

$root = Tag::create(['name' => 'Root']);// 创建子标签$child1 = $root->children()->create(['name' => 'Child1']);$child = Tag::create(['name' => 'Child2']);$child->makeChildOf($root);// 批量构建树$tagTree = [    'name' => 'RootTag',    'children' => [        ['name' => 'L1Child1',            'children' => [                ['name' => 'L2Child1'],                ['name' => 'L2Child1'],                ['name' => 'L2Child1'],            ]        ],        ['name' => 'L1Child2'],        ['name' => 'L1Child3'],    ]];Tag::buildTree($tagTree);
Copier après la connexion

更多关联操作请查看: etrepat/baum。

标签名称规则说明

  • 标签名里的特殊符号和空格会被 -替代;
  • 智能标签 slug 生成,会生成 name 对应的中文拼音 slug ,如: 标签-> biao-qian,拼音一样的时候会被加上随机值;

标签名清理使用: $normalize_string = EstGroupe\Taggable\Util::tagName($name)。

Tag::create(['标签名']);// name: 标签名// slug: biao-qian-mingTag::create(['表签名']);// name: 表签名// slug: biao-qian-ming-3243 (后面 3243 为随机,解决拼音冲突)Tag::create(['标签 名']);// name: 标签-名// slug: biao-qian-mingTag::create(['标签!名']);// name: 标签-名// slug: biao-qian-ming
Copier après la connexion

安装说明:

安装

composer require estgroupe/laravel-taggable "5.1.*"
Copier après la connexion

安装和执行迁移

在 config/app.php的 providers数组中加入:

'providers' => array(    \EstGroupe\Taggable\Providers\TaggingServiceProvider::class,);
Copier après la connexion
php artisan vendor:publish --provider="EstGroupe\Taggable\Providers\TaggingServiceProvider"php artisan migrate
Copier après la connexion

请仔细阅读 config/tagging.php文件。

创建 Tag.php

不是必须的,不过建议你创建自己项目专属的 Tag.php 文件。

<?php namespace App\Models;use EstGroupe\Taggable\Model\Tag as TaggableTag;class Tag extends TaggableTag{    // Model code go here}
Copier après la connexion

修改 config/tagging.php文件中:

    'tag_model'=>'\App\Models\Tag',
Copier après la connexion

加入 Taggable Trait

<?php namespace App\Models;use Illuminate\Database\Eloquent\Model;use EstGroupe\Taggable\Taggable;class Article extends \Illuminate\Database\Eloquent\Model {    use Taggable;}
Copier après la connexion

「标签状态」标示

Taggable能跟踪模型是否打过标签的状态:

// `no`$article->is_tagged// `yes`$article->tag('Tag1');$article->is_tagged;// `no`$article->unTag();$article->is_tagged// This is fast$taggedArticles = Article::where('is_tagged', 'yes')->get()
Copier après la connexion

首先你需要修改 config/tagging.php文件中:

'is_tagged_label_enable' => true,
Copier après la connexion

然后在你的模型的数据库创建脚本里加上:

<?phpuse Illuminate\Database\Schema\Blueprint;use Illuminate\Database\Migrations\Migration;class CreateArticlesTable extends Migration {    public function up()    {        Schema::create('weibo_statuses', function(Blueprint $table) {            $table->increments('id');            ...            // Add this line            $table->enum('is_tagged', array('yes', 'no'))->default('no');            ...            $table->timestamps();        });    }}
Copier après la connexion

「推荐标签」标示

方便你实现「推荐标签」功能,只需要把 suggest字段标示为 true:

$tag = EstGroupe\Taggable\Model\Tag::where('slug', '=', 'blog')->first();$tag->suggest = true;$tag->save();
Copier après la connexion

即可以用以下方法读取:

$suggestedTags = EstGroupe\Taggable\Model\Tag::suggested()->get();
Copier après la connexion

重写 Util 类?

大部分的通用操作都发生在 Util 类,你想获取更多的定制权力,请创建自己的 Util 类,并注册服务提供者:

namespace My\Project\Providers;use EstGroupe\Taggable\Providers\TaggingServiceProvider as ServiceProvider;use EstGroupe\Taggable\Contracts\TaggingUtility;class TaggingServiceProvider extends ServiceProvider {    /**     * Register the service provider.     *     * @return void     */    public function register()    {        $this->app->singleton(TaggingUtility::class, function () {            return new MyNewUtilClass;        });    }}
Copier après la connexion

然后在

注意 MyNewUtilClass必须实现 EstGroupe\Taggable\Contracts\TaggingUtility接口。

使用范例

$article = Article::with('tags')->first(); // eager load// 获取所有标签foreach($article->tags as $tag) {    echo $tag->name . ' with url slug of ' . $tag->slug;}// 打标签$article->tag('Gardening'); // attach the tag$article->tag('Gardening, Floral'); // attach the tag$article->tag(['Gardening', 'Floral']); // attach the tag$article->tag('Gardening', 'Floral'); // attach the tag// 批量通过 tag ids 打标签$article->tagWithTagIds([1,2,3]);// 去掉标签$article->untag('Cooking'); // remove Cooking tag$article->untag(); // remove all tags// 重打标签$article->retag(['Fruit', 'Fish']); // delete current tags and save new tags$article->retag('Fruit', 'Fish');$article->retag('Fruit, Fish');$tagged = $article->tagged; // return Collection of rows tagged to article$tags = $article->tags; // return Collection the actual tags (is slower than using tagged)// 获取绑定的标签名称数组$article->tagNames(); // get array of related tag names// 获取打了「任意」标签的 Article 对象Article::withAnyTag('Gardening, Cooking')->get(); // fetch articles with any tag listedArticle::withAnyTag(['Gardening','Cooking'])->get(); // different syntax, same result as aboveArticle::withAnyTag('Gardening','Cooking')->get(); // different syntax, same result as above// 获取打了「全包含」标签的 Article 对象Article::withAllTags('Gardening, Cooking')->get(); // only fetch articles with all the tagsArticle::withAllTags(['Gardening', 'Cooking'])->get();Article::withAllTags('Gardening', 'Cooking')->get();EstGroupe\Taggable\Model\Tag::where('count', '>', 2)->get(); // return all tags used more than twiceArticle::existingTags(); // return collection of all existing tags on any articles
Copier après la connexion

如果你,即可使用以下标签读取功能:

// 通过 slug 获取标签Tag::byTagSlug('biao-qian-ming')->first();// 通过名字获取标签Tag::byTagName('标签名')->first();// 通过名字数组获取标签数组Tag::byTagNames(['标签名', '标签2', '标签3'])->first();// 通过 Tag ids 数组获取标签数组Tag::byTagIds([1,2,3])->first();// 通过名字数组获取 ID 数组$ids = Tag::idsByNames(['标签名', '标签2', '标签3'])->all();// [1,2,3]
Copier après la connexion

标签事件

Taggabletrait 提供以下两个事件:

EstGroupe\Taggable\Events\TagAdded;EstGroupe\Taggable\Events\TagRemoved;
Copier après la connexion

监听标签事件:

\Event::listen(EstGroupe\Taggable\Events\TagAdded::class, function($article){    \Log::debug($article->title . ' was tagged');});
Copier après la connexion

单元测试

基本用例测试请见: tests/CommonUsageTest.php。

运行测试:

composer installvendor/bin/phpunit --verbose
Copier après la connexion

Thanks

  • Special Thanks to: Robert Conner - http://smartersoftware.net
  • overtrue/pinyin
  • etrepat/baum
  • Made with love by The EST Group - http://estgroupe.com/
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Travailler avec les données de session Flash dans Laravel Travailler avec les données de session Flash dans Laravel Mar 12, 2025 pm 05:08 PM

Laravel simplifie la gestion des données de session temporaires à l'aide de ses méthodes de flash intuitives. Ceci est parfait pour afficher de brefs messages, alertes ou notifications dans votre application. Les données ne persistent que pour la demande ultérieure par défaut: $ demande-

Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Curl dans PHP: Comment utiliser l'extension PHP Curl dans les API REST Mar 14, 2025 am 11:42 AM

L'extension PHP Client URL (CURL) est un outil puissant pour les développeurs, permettant une interaction transparente avec des serveurs distants et des API REST. En tirant parti de Libcurl, une bibliothèque de transfert de fichiers multi-protocol très respectée, PHP Curl facilite Efficient Execu

Misque de réponse HTTP simplifié dans les tests Laravel Misque de réponse HTTP simplifié dans les tests Laravel Mar 12, 2025 pm 05:09 PM

Laravel fournit une syntaxe de simulation de réponse HTTP concise, simplifiant les tests d'interaction HTTP. Cette approche réduit considérablement la redondance du code tout en rendant votre simulation de test plus intuitive. L'implémentation de base fournit une variété de raccourcis de type de réponse: Utiliser illuminate \ support \ faades \ http; Http :: faux ([[ 'google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

12 meilleurs scripts de chat PHP sur Codecanyon 12 meilleurs scripts de chat PHP sur Codecanyon Mar 13, 2025 pm 12:08 PM

Voulez-vous fournir des solutions instantanées en temps réel aux problèmes les plus pressants de vos clients? Le chat en direct vous permet d'avoir des conversations en temps réel avec les clients et de résoudre leurs problèmes instantanément. Il vous permet de fournir un service plus rapide à votre personnalité

Expliquez le concept de liaison statique tardive en PHP. Expliquez le concept de liaison statique tardive en PHP. Mar 21, 2025 pm 01:33 PM

L'article traite de la liaison statique tardive (LSB) dans PHP, introduite dans PHP 5.3, permettant une résolution d'exécution de la méthode statique nécessite un héritage plus flexible. Problème main: LSB vs polymorphisme traditionnel; Applications pratiques de LSB et perfo potentiel

Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Caractéristiques de sécurité du cadre: protection contre les vulnérabilités. Mar 28, 2025 pm 05:11 PM

L'article traite des fonctionnalités de sécurité essentielles dans les cadres pour se protéger contre les vulnérabilités, notamment la validation des entrées, l'authentification et les mises à jour régulières.

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

See all articles