bnqtoan / laravel-taxonomies
为 Laravel 提供简单、可嵌套的术语和分类(类似于 WordPress)(兼容 Laravel 11,基于 lecturize/laravel-taxonomies 分支开发)
Requires
- php: ^8.2
- cviebrock/eloquent-sluggable: ^11.0
- illuminate/database: ^11.0
- illuminate/support: ^11.0
- webpatser/laravel-uuid: ^3.0|^4.0
Requires (Dev)
- mockery/mockery: ^1.4
- orchestra/testbench: ^7.0|^8.0
- phpunit/phpunit: ^8.0|^9.0|^10.0
README
Laravel 分类
简单、可嵌套的术语和分类(类似于 WordPress)为 Laravel。
安装
从您的 composer.json 文件中引入此包
"require": { "lecturize/laravel-taxonomies": "^1.2" }
并运行 $ composer update 或使用 $ composer require lecturize/laravel-taxonomies 同时完成。
配置与迁移
$ php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider" $ php artisan vendor:publish --provider="Lecturize\Taxonomies\TaxonomiesServiceProvider"
这将发布 config/sluggable.php、config/lecturize.php 和一些迁移文件,您需要运行这些文件
$ php artisan migrate
为了正确发布迁移,请确保您已将目录 database/migrations 添加到项目的 composer.json 中的类映射。
使用方法
首先,将我们的 HasCategories 特性添加到您的模型中。
<?php namespace App\Models; use Lecturize\Taxonomies\Contracts\CanHaveCategories; use Lecturize\Taxonomies\Traits\HasCategories; class Post extends Model implements CanHaveCategories { use HasCategories; // ... } ?>
添加术语
$model->addCategory('My Category', 'blog_category')
添加多个术语
$model->addCategories(['Add','Multiple','Categories'], 'blog_category')
添加带有可选的 parent_id(分类 -> id)和排序顺序的术语
$model->addCategory('My Category', 'blog_category', 1, 2)
通过分类获取模型的全部术语
$model->getCategories('taxonomy')
通过(可选的)分类获取模型的具体术语
$model->getCategory('My Category', 'blog_category')
检查模型是否在给定的分类中有给定的分类
$model->hasCategory('My Category', 'blog_category')
通过(可选的)分类从模型中删除术语
$model->detachCategory('My Category', 'blog_category')
从模型中(分离)删除所有分类关系
$model->detachCategories()
通过给定的任何分类范围模型
$model = Model::categorizedIn(['Add','Multiple','Categories'], 'blog_category')->get();
通过一个分类范围模型
$model = Model::categorized('My Category', 'blog_category')->get();
辅助函数
我包括了一组辅助函数以供您方便使用,请参阅 src/helpers.php。
自定义分类模型
请确保创建一个自定义的 Taxonomy 模型,该模型扩展 Lecturize\Taxonomies\Models\Taxonomy。
<?php namespace App\Models; use App\Models\Post; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\MorphToMany; use Lecturize\Taxonomies\Models\Taxonomy as TaxonomyBase; class Taxonomy extends TaxonomyBase { public function posts(): MorphToMany { return $this->morphedByMany(Post::class, 'taxable', 'taxables') ->withTimestamps(); } }
别忘了发布配置文件,并更新 lecturize.taxonomies.taxonomies.model 的值为 \App\Models\Post:class。
示例
向 Eloquent 模型添加分类
$post = Post::find(1); $post->addCategory('My First Category', 'blog_category'); $post->addCategories(['Category Two', 'Category Three'], 'blog_category');
首先,此片段将在您的 terms 表中创建三个条目(如果它们尚未存在)
- 我的第一个分类
- 分类二
- 分类三
然后,它将在您的 taxonomies 表中创建三个条目,将术语与给定的分类 "category" 相关联。
最后,它将在您的 pivot 表中将来自您的 taxonomies 表的条目与您的模型(在此示例中为 "Post" 模型)相关联。
为什么有三个表?
想象您有一个分类 post_cat 和另一个分类 product_cat,第一个分类用于博客文章,第二个用于在线商店的产品。现在您使用 $product->addCategory('Shoes', 'product_cat'); 向一个名为 Shoes 的分类添加一个产品。之后,您想写一篇关于该产品的博客,并使用 $product->addCategory('Shoes', 'post_cat'); 将该文章添加到名为 Shoes 的 post_cat 中。
通常,现在您数据库中会有两个条目,一个像 ['Shoes','product_cat'],另一个 ['Shoes','post_at']。哎呀,现在您意识到您拼错了 Shoes,现在您需要更改两次,针对每个分类。
所以我希望在整个应用程序中保持我的 Terms 唯一,这就是为什么我将它们与分类分开,并简单地关联它们。
更新日志
[2021-02-09] v1.0
扩展了数据库表以支持 UUID(请确保为现有模型生成一些),并提供了更好的自定义。整个包中有很多破坏性的更改。
[2022-05-16] v1.1
更新了依赖项以支持 PHP 8 和 Laravel 8/9 - 对于旧版本,请参阅 v1.0。添加了新的列如 content、lead、meta_desc、visible 和 searchable 到分类表。将 Taxonomy 模型上的 term 范围重命名为 byTerm,以避免与其 term 关系方法混淆。
[2022-06-04] v1.2
已移除Taxable模型,您应该在项目中创建一个自定义的Taxonomy模型,该模型扩展Lecturize\Taxonomies\Models\Taxonomy,并包含您项目特定的morphedByMany关系,例如posts。别忘了相应地覆盖config('lecturize.taxonomies.taxonomies.model')的配置值。
在taxable交叉表上添加了一个主键,确保在发布和运行新的迁移之前,该表中没有重复项!此外,还向交叉表添加了时间戳。
如果您正在使用get_categories_collection()或build_categories_collection_from_tree()辅助函数或Taxonomy::getTree(),请查看略有修改的签名。现在我们要求的是$taxable_relation(例如,您自定义分类模型上的posts关系),而不是通过$taxable参数传递一个taxables类(例如\Post:class)。如果您继续传递类名如\Post:class,我们将尝试使用Str::plural()来猜测关系。
许可协议
在MIT许可协议下许可。
作者
由Alexander Manfred Poellmann在维也纳和罗马手工制作。