Php 按Laravel多对多多态中最常用的标记排序
我正在从事一个Laravel项目,我需要为多个有说服力的模型实现标记功能,所以我选择了多对多多态关系来完成这项任务。我需要显示相关的标签,并在侧栏部分按最常用于特定型号的标签进行排序 目前,这些模型表需要标记功能: 图片id,文件名。。。 视频id,文件名。。。 文章id,slug,标题,摘要,内容。。。 我用taggables透视表制作了标签模型 标记id、名称、描述 标记符id,标记符id,标记符类型,标记符id 所有这些模型都通过morphToMany与标记模型连接,标记模型通过morphedByMany关系按约定连接,与中的方式相同,并且都可以正常工作 这是标记轴模式:Php 按Laravel多对多多态中最常用的标记排序,php,laravel,eloquent,laravel-query-builder,Php,Laravel,Eloquent,Laravel Query Builder,我正在从事一个Laravel项目,我需要为多个有说服力的模型实现标记功能,所以我选择了多对多多态关系来完成这项任务。我需要显示相关的标签,并在侧栏部分按最常用于特定型号的标签进行排序 目前,这些模型表需要标记功能: 图片id,文件名。。。 视频id,文件名。。。 文章id,slug,标题,摘要,内容。。。 我用taggables透视表制作了标签模型 标记id、名称、描述 标记符id,标记符id,标记符类型,标记符id 所有这些模型都通过morphToMany与标记模型连接,标记模型通过morph
<?php
class CreateTaggablesTable extends Migration {
public function up() {
Schema::create('taggables', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('tag_id');
$table->morphs('taggable');
$table->unique(['tag_id', 'taggable_type', 'taggable_id']); // Only unique
});
}
}
这是可行的,但是有没有更简单、更优雅的方法呢?至少,为了摆脱我需要硬编码或通过变量传递特定模型tagu类型的事实?我宁愿为每个模型制作3种不同的方法,也不愿在代码中的任何地方硬编码它们。withCount'relationship'为附加列添加一个select
Article::withCount('tags')->orderBy('tags_count', 'desc')->get();
Picture::withCount('tags')->orderBy('tags_count', 'desc')->get();
Video::withCount('tags')->orderBy('tags_count', 'desc')->get();
Laravel Docs:withCount'relationship'为附加列添加一个选择
Article::withCount('tags')->orderBy('tags_count', 'desc')->get();
Picture::withCount('tags')->orderBy('tags_count', 'desc')->get();
Video::withCount('tags')->orderBy('tags_count', 'desc')->get();
拉威尔医生:我想你误解了我。事实上,您的答案是正确的,但我不需要通过检索特定的模型来计算它们。我需要检索与特定模型类型tagu类型关联的所有标记,并按最常用的类型对它们进行排序。最常用的方法实际上是通过计算taggables数据透视表中的行数来确定的。想象一下,在侧边栏的一节中,你循环所有的标记名,看看上面的fetchLatest方法,但是你需要按照使用次数对它们进行排序,而不是按照latest进行排序。我想你误解了我的意思。事实上,您的答案是正确的,但我不需要通过检索特定的模型来计算它们。我需要检索与特定模型类型tagu类型关联的所有标记,并按最常用的类型对它们进行排序。最常用的方法实际上是通过计算taggables数据透视表中的行数来确定的。想象一下,在侧边栏部分,您循环所有标记名,查看上面的fetchLatest方法,但是您需要按照使用次数对它们进行排序,而不是按最新方法进行排序。您还在寻找答案吗?Ofc。如果你知道这样做有多容易,那当然。我仍然在维护这个项目。我最终通过硬编码解决了这个问题,我不喜欢硬编码,但我尽了最大努力。如果我理解正确,您可以使用with count:Tag::with count'articles'->orderByDesc'articles\u count'->[…]的确如此。我一定会试试的。我不记得现在我是否已经尝试过这个,我是否尝试过为什么我放弃使用withCount。你还在找答案吗?Ofc。如果你知道这样做有多容易,那当然。我仍然在维护这个项目。我最终通过硬编码解决了这个问题,我不喜欢硬编码,但我尽了最大努力。如果我理解正确,您可以使用with count:Tag::with count'articles'->orderByDesc'articles\u count'->[…]的确如此。我一定会试试的。我不记得现在我是否已经尝试过这个,我是否尝试过为什么我放弃使用withCount。谢谢你的小费。
select `tags`.`id`, `tags`.`name`, count(taggables.tag_id) as aggregate from `tags` inner join `taggables` on `tags`.`id` = `taggables`.`tag_id` where `taggables`.`taggable_type` = 'App\Article' and `tags`.`deleted_at` is null group by `tags`.`id`, `tags`.`name` order by `aggregate` desc limit 15
Article::withCount('tags')->orderBy('tags_count', 'desc')->get();
Picture::withCount('tags')->orderBy('tags_count', 'desc')->get();
Video::withCount('tags')->orderBy('tags_count', 'desc')->get();