Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按Laravel多对多多态中最常用的标记排序_Php_Laravel_Eloquent_Laravel Query Builder - Fatal编程技术网

Php 按Laravel多对多多态中最常用的标记排序

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

我正在从事一个Laravel项目,我需要为多个有说服力的模型实现标记功能,所以我选择了多对多多态关系来完成这项任务。我需要显示相关的标签,并在侧栏部分按最常用于特定型号的标签进行排序

目前,这些模型表需要标记功能:

图片id,文件名。。。 视频id,文件名。。。 文章id,slug,标题,摘要,内容。。。 我用taggables透视表制作了标签模型

标记id、名称、描述 标记符id,标记符id,标记符类型,标记符id 所有这些模型都通过morphToMany与标记模型连接,标记模型通过morphedByMany关系按约定连接,与中的方式相同,并且都可以正常工作

这是标记轴模式:

<?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();