lecturize / laravel-taxonomies
为 Laravel 提供简单、可嵌套的术语和分类(类似于 WordPress)。
Requires
- php: ^8.0
- cviebrock/eloquent-sluggable: ^8.0|^9.0
- illuminate/database: ^8.0|^9.0
- illuminate/support: ^8.0|^9.0
- webpatser/laravel-uuid: ^3.0|^4.0
Requires (Dev)
- doctrine/dbal: ^2.12|^3.3
- mockery/mockery: ~1.0
- orchestra/testbench: ^6.23 || ^7.0
- phpunit/phpunit: ^8.0|^9.0
README
Laravel 分类
为 Laravel 提供简单、可嵌套的术语和分类(类似于 WordPress)。
安装
从您的 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
扩展数据库表以支持 UUIDs(确保为现有模型生成一些),以及更好的自定义。整个包中有很多破坏性更改。
[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参数传递一个可征税类(例如\Post:class)。如果您继续传递一个类名,例如\Post:class,我们将尝试使用Str::plural()来猜测关系。
许可证
在MIT许可证下授权。
作者
由Alexander Manfred Poellmann在维也纳和罗马用心制作。