fomvasss/laravel-taxonomy
Composer 安装命令:
composer require fomvasss/laravel-taxonomy
包简介
Management of taxonomy in Laravel projects
README 文档
README
Development and support of this package is discontinued! Use a better solution fomvasss/laravel-simple-taxonomy
Laravel Taxonomy
Create and manage taxonomy categories (terms) in Laravel Eloquent.
Установка
composer require fomvasss/laravel-taxonomy
Publishing resources
php artisan vendor:publish --provider="Fomvasss\Taxonomy\TaxonomyServiceProvider"
После публикации ресурсов, вы можете изменить файл миграции, seeder и переопределить Eloquent-модели термов, словарей.
composer dump-autoload php artisan migrate php artisan db:seed --class=TaxonomySeeder
При использовании переопределенных классов моделей терминов и словарей, нужно указать в конфигу
taxonomy.phpпути этих моделей, иначе система будет работать не так как вы планируете!
Usage
Usage in own models
Для использование в ваших моделях таксономии, нужно подключить трейт
HasTaxonomiesв котором есть relation methods & scope`s:
Relations
termsByVocabulary()- Связь текущей модели с термамы по указанному словарю (поsystem_name). Используется для создание связей с термамы нужного словаря в своих моделяхterms()- Сущность текущей модели "относится" к разным термам (полиморфизм), например: товар в магазине относится к разным категориямterm()- Сущность имеет один терм (ключ для связи создается в таблице текущей сущности), например: экземпляр автомобиля имеет бренд
Scopes
termsByVocabulary()- Термы текущей модели по указанному словарю (поsystem_name). Не путать с связьюtermsByVocabulary()!byTaxonomies()- Сущности по указанным термам с соответствующих указанных словарей (ключи по умолчанию:vocabulary.system_name,term.id)
Можно создавать в своих моделях, свои, более удобные, методы для связей, на основе метода-связи terms().
Например: модель статьи Article относится к разным термам-категориям Term со словаря (Vocabulary) "Категории статей" (vocabularies.id = 1, vocabularies.system_name = "article_categories") то метод связи между статьей и ее категориями можно назвать txArticleCategories и записать как:
Удобно строить связь используя метод
termsByVocabulary()и указывая системное имя нужного словаря:
public function txArticleCategories() { return $this->termsByVocabulary('article_categories'); }
В ваших методах, для связей с таксономией (термины, словари), рекомендуется использовать как стандарт префикс "tx" (
txArticleCategories,txArticleStatus,txBrandstxRegion,...) - это только рекомендация:)
Например, если метод txArticleCategories() использовать в модели Article, то он описывает связь статьи с категориямы.
Все категории статьи можно получить:
$article = Models\Article::first()->txArticleCategories;
Аналогично, можно использовать метод term() в вашей модели. Например, опишем связь статьи с термом словаря статусов модерации статьи,
при этом укажем поля для связей модели терма-статуса с самой моделью статьи:
public function txArticleStatus() { return $this->term('status', 'system_name') ->where('vocabulary', 'article_statuses'); }
где:
txArticleStatus- название метода для связи сущности-статьи с термом-статусом (можно любое, по правилам Laravel)status- поле в таблице текущой сущности (статьи), где хранится статус, через которое и установленная связь с термом (articles.status)system_name- поле в таблице термов (в нашем случае записано системное имя статуса) (terms.system_name)vocabulary- поле в таблице термов, в котором записано систимное название словаря (terms.vocabulary)article_statuses- название словаря, записанное в таблице термов (terms.vocabulary)
Например, если метод txArticleStatus() использовать в модели Article, то он описывает статус статьи.
Данные терма-статуса, например имя статуса, можно получить:
$article = \App\Models\Article::first(); $article->txArticleStatus->name;
В переопределенной модели Term вы можете описать метод, для получения всех статтей по терму-категории:
public function articles() { return $this->morphedByMany(Article::class, 'termable'); }
И использовать его:
Term::byVocabulary('article_categories')->first(13)->articles
Методы в модели Vocabulary
Связи
terms()- Словарь имет много термов
Полиморфные связи
vocabulariesByMany()- Сущность текущей модели "держит" много словарейvocabulariesToMany()- Сущность текущей модели "относится" к разным словарямtermsByMany()- Сущность текущей модели "держит" много термовtermsToMany()- Сущность текущей модели "относится" к разным термам
Методи в модели Term
Связи
txVocabulary()- Терм "пренадлежит" одному словарю
Полиморфные связи
vocabulariesByMany()- Сущность текущей модели "держит" много словарейvocabulariesToMany()- Сущность текущей модели "относится" к разным словарямtermsByMany()- Сущность текущей модели "держит" много термовtermsToMany()- Сущность текущей модели "относится" к разным термам (илиterms()с трейтаHasTaxonomies)
Scopes в модели Term
byVocabulary()- Все термы по указанному словарю
Работа с иерархией в терминах таксономии (рекомендации)
- Работа с иерархией в этом пакете построена на "laravel-nestedset"
- Для моделей термов доступны все методы пакета
laravel-nestedset.
Еще примеры использования:
\App\Models\Taxonomy\Term::find(1)->vocabulary; // get system name vocabulary \App\Models\Taxonomy\Term::find(1)->txVocabulary; // get related model vocabulary \App\Models\Taxonomy\Term::byVocabulary('article_categories')->get(); // get terms by system name vocabulary \App\Models\Taxonomy\Term::byVocabulary('article_categories')->get()->toTree(); // `toTree` - method from package `lazychaser/laravel-nestedset` \App\Models\Taxonomy\Term::find(1)->descendants; // `descendants` - method from package `lazychaser/laravel-nestedset` \App\Models\Article::with('txArticleCategories')->get(); // get articles with article categories \App\Models\Article::first()->txArticleCategories()->attach([1, 2]); \App\Models\Article::first()->txArticleCategories()->sync([4, 2]); // this detach all terms in article and sync 4 ,2!!! Same as: \App\Models\Article::first()->terms()->sync([4, 2]); \App\Models\Article::first()->terms()->detach([4]); \App\Models\Article::first()->txArticleCategories()->syncWithoutDetaching([4, 2]); // sync terms without detaching \App\Models\Article::byTaxonomies([ 'article_categories' => [1,3,5], 'cities' => [3] ])->get(); // use for example for filters
Links
fomvasss/laravel-taxonomy 适用场景与选型建议
fomvasss/laravel-taxonomy 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 701 次下载、GitHub Stars 达 3, 最近一次更新时间为 2018 年 02 月 08 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「tree」 「categories」 「taxonomy」 「nestedset」 「laravel」 「terms」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 fomvasss/laravel-taxonomy 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 fomvasss/laravel-taxonomy 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 fomvasss/laravel-taxonomy 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Categories for NetCommons Plugin
jsTree widget for yii2
PHP Interface for Babel Street Text Analytics
Adjacency List’ed Closure Table database design pattern implementation for Laravel. Includes restore of tree
Doctrine2 behavior traits - slowhop fork
Icon support for Silverstripe taxonomy terms
统计信息
- 总下载量: 701
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 9
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-02-08