首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在laravel中使用多个withcount()列sum和order by

在 Laravel 中,withCount() 方法用于在 Eloquent 关系中添加一个计数器,以便在查询时获取关联模型的数量。如果你想要对多个关联模型进行计数,并且对这些计数进行求和以及排序,你可以使用子查询或者 DB facade 来实现。

以下是一个示例,假设我们有一个 Post 模型,它有两个关联模型 CommentLike,我们想要获取每个帖子的评论数和点赞数的总和,并按照这个总和进行排序。

使用子查询

代码语言:txt
复制
use App\Models\Post;
use Illuminate\Support\Facades\DB;

$posts = Post::select('posts.*', DB::raw('
    (SELECT COUNT(*) FROM comments WHERE comments.post_id = posts.id) +
    (SELECT COUNT(*) FROM likes WHERE likes.post_id = posts.id) AS total_interactions
'))
->orderBy('total_interactions', 'desc')
->get();

在这个例子中,我们使用了两个子查询来分别计算每个帖子的评论数和点赞数,然后将它们相加得到 total_interactions 字段,并按照这个字段进行降序排序。

使用 withCount() 和 DB facade

如果你想要使用 withCount() 方法,你可以先获取所有帖子及其关联计数,然后在内存中进行排序。这种方法可能不适合大数据集,因为它会将所有数据加载到内存中。

代码语言:txt
复制
use App\Models\Post;

$posts = Post::withCount(['comments', 'likes'])
    ->get()
    ->sortByDesc(function ($post) {
        return $post->comments_count + $post->likes_count;
    });

在这个例子中,我们首先使用 withCount() 方法获取所有帖子的评论数和点赞数,然后使用 sortByDesc() 方法在内存中对结果进行排序。

注意事项

  • 当使用子查询时,确保关联模型的外键名称正确无误。
  • 如果数据量很大,建议使用子查询方法,因为它可以直接在数据库层面进行排序,效率更高。
  • 在使用 withCount() 方法时,如果关联模型有额外的 where 条件,需要使用 ->whereHas() 方法来指定这些条件。

以上两种方法都可以实现你的需求,选择哪一种取决于你的具体场景和性能考虑。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Laravel Eloquent 模型关联关系(下)

学院%'); })->get(); 底层执行的 SQL 查询语句如下: 如果你想进一步过滤出文章标题和评论都包含「Laravel学院」的用户,可以在上述闭包函数中通过查询构建器进一步指定: $users...whereHas 方法和 orWhereHas 方法相对的,也有 whereDoesntHave 和 orWhereDoesntHave 方法,使用方法一样,这里就不再赘述了。...此外,你还可以通过数组传递多个关联关系一次统计多个字段,还可以通过闭包函数指定对应统计的过滤条件: $post = Post::withCount(['tags', 'comments' => function...`deleted_at` is null order by `created_at` desc 懒惰渴求式加载 有时候,你可能觉得一次性加载所有关联数据有点浪费,对于特定条件下才使用的数据我们可以通过动态条件判断进行渴求式加载或者延迟加载...希望你看完学院君的这一系列教程可以了解并完全掌握 Eloquent 模型的定义和使用,有什么问题,欢迎随时与我交流。

19.6K30

Laravel学习记录--Model

使用渴求式加载,即根据预先需求查询出所有数据 为了验证[渴求式加载]的好处,举下列例子 这里用到了Laravel Debugbar 调试 安装方法可参照我的另一个博客 - - - Laravel...渴求式加载多个关联关系 有时候你需要在单个操作中渴求式加载多个不同的关联关系,要实现这一功能,只需添加参数到with方法即可 ,以逗号分割 如,查询文章的作者即所在栏目 嵌套的渴求式加载 要使用嵌套的渴求式加载的关联关系...withCount方法,此方法会在你的结果集模型中添加一个{关联名_count}字段 如查询每个用户的号码数量 public function show(){ $res = Muser:...在调用save方法向Phone模型插入值 这里Eloquent自动在phones表中添加了uid字段,并插入正确的值 使用saveMany添加多个值 $user = \App\Muser::find...对应关联方法的名称)的touches属性即可,支持添加多个关联关系 如: <?

13.6K20
  • 为什么 Laravel 这么优秀?

    这篇文章中我使用的 Demo 是最新版的 Laravel 10.x 以及 PHP 8.2。...中可以高效的使用 Eloquent ORM 实现各种查询;如上面的例子中我们使用了 withCount 来查询课程的学生数量、用 with 加载课程对应的教师;还可以指定生成的 SQL 查询只包含某几个字段如...如 Java 的 Spring 会在编译时为 Sprint Container 填充不同的对象,在使用时就能向容器获取不同的值。...;如 CacheServiceProvider 会向容器中注册 Cache 对象,后续在使用 Cache::get 时就使用的是这里注册的 Cache 对象,在注册阶段不应该向容器中获取值,因为此时服务可能还没有...Laravel 默认会注册 20 多个 Service Provider,每个 Service Provider 都为 Laravel 提供了一种新的能力:如 Cookie/Session/DB/Filesystem

    26610

    通过 Laravel 查询构建器实现复杂的查询语句

    >', 0)->get(); 上述代码表示获取 where id 0 的数据库记录,多个 and 查询可以通过多个 where 方法连接,同理,多个 or 查询也可以通过多个...,如 select * from posts p left join users u on p.user_id = u.id 右连接:与左连接相反,返回右表中的所有行,如果右表中的行在左表中没有匹配行,...则结果中左表中的对应列返回空值,如 select * from posts p right join users u on p.user_id = u.id 全连接:返回左表和右表中的所有行。...当某行在另一表中没有匹配行,则另一表中的列返回空值,如 select * from posts p full join users u on p.user_id = u.id 交叉连接:也称笛卡尔积,不带...另一种是通过 offset 方法和 limit 方法组合进行分页查询,offset 表示从第几条记录开始,limit 表示一次获取多少条记录,使用方式和 skip 和 take 类似: $posts =

    30.2K20

    【Laravel系列4.4】模型Eloquent ORM的使用(二)

    模型Eloquent ORM的使用(二) 对于模型的探索我们还将继续。上篇文章中,只是简单地通过模型操作了一下数据库,并且学习了一下关联操作的知识。...因为这些东西,都已经写在了官方文档中,而对于这个系列的文章来说,入个门,然后搞清楚原理才是最重要的,对于怎么使用这个事,大家自己好好研究就好了。...比如说我们可以使用类似于 array_map() 的函数把集合中的对象全部转换成数组,还可以用一个类似于 array_column() 的函数只获取数据中的两个字段组成键值对形式的数据。...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...__call() 魔术方法中,在这里,我们看到它调用了 forwardCallTo() 方法,然后传递进去的是一个新的 查询构造器 对象和方法名以及参数。

    2.8K20

    Laravel之collection

    collect($arr)->pluck('order_products.*.price')->flatten(1)->sum(); 二、 格式化登机口 希望加深 map 的理解和 map 的应用场景...三、计算 Github 活跃度 通过 API 后获取到数据,将数据转化为得分的一种机制,首先会尝试 foreach 的方式,然后再用 Laravel 的 Collection 来优化和重构 https...四、转化评论格式 Laravel Collection 中的 implode 方法其实在某些场景之下非常的有用,结合 map ,我们就可以对每个元素进行自由度很高的格式自定义,本节视频是普通格式转 Markdown...五、计算每月营业额 在之前的示例当中,我们都是对一个数组进行优化和重构。这节学习使用 zip 方法来解决两个数组的情况。 ? ? ? ?...六、reduce 创建 lookup 数组 在 Laravel Collection 当中,还有一个非常常用的方法:reduce,这对于我们在创建 lookup 数组的时候非常的有用,这样就可以使用

    1.2K40

    【Java 进阶篇】深入理解 SQL 分组查询

    分组查询是 SQL 中的一种数据汇总技术,它将数据库中的数据按照一个或多个列的值进行分组,然后对每个分组应用聚合函数来计算汇总结果。...数据排序:按照某个列或多个列的值对数据进行排序。 接下来,让我们一起学习 SQL 分组查询的基本语法和用法。...聚合函数:对于每个分组,可以应用一个或多个聚合函数(如 SUM、AVG、COUNT、MAX、MIN 等)来计算汇总值。 HAVING 子句:可选的,用于筛选分组后的结果。...查找每日订单数量和总金额 如果我们希望查找每天的订单数量和总金额,可以按照 order_date 列进行分组,并使用聚合函数计算。...GROUP BY order_date; 在这个查询中,我们选择了 order_date 列作为分组的依据,然后使用 COUNT 函数计算每日的订单数量,使用 SUM 函数计算每日的订单总金额。

    43320

    【数据库设计和SQL基础语法】--查询数据--分组查询

    GROUP BY: 指定分组的列。查询结果将按照这些列中的值进行分组。 aggregate_function: 对每个分组执行的聚合函数,如 COUNT、SUM、AVG、MAX、MIN 等。...FROM sales_orders GROUP BY product_id; 在这个例子中,我们按照产品ID进行分组,并使用了两个聚合函数,SUM 和 AVG。...使用场景: 当你想要对数据进行分组,并对每个组应用聚合函数(如 COUNT、SUM、AVG)以计算统计信息时,你会使用 GROUP BY。...七、 最佳实践和注意事项 在进行分组查询时,有一些最佳实践和注意事项可以帮助你编写更有效和可维护的 SQL 查询: 选择适当的聚合函数: 根据你的需求选择正确的聚合函数,如 COUNT、SUM、AVG、...理解 ROLLUP 和 CUBE 的用途: ROLLUP 和 CUBE 允许你在一个查询中获得多个分组层次的聚合结果。选择使用它们时要确保理解它们的效果。

    1.1K10

    【数据库设计和SQL基础语法】--查询数据--聚合函数

    支持统计分析,如计算平均值、总和、最大值和最小值等。 用于处理大量数据,从而提高查询效率。 1.3 常见聚合函数 常见的聚合函数包括: COUNT:计算行数。 SUM:计算数值列的总和。...在数据统计和分析中具有广泛应用,通过不同的参数和条件组合,可以灵活地满足各种统计需求。 2.2 SUM 基本用法 SUM 函数用于计算查询结果集中某列的数值总和。...SUM: 计算每个分组中某列的总和。 AVG: 计算每个分组中某列的平均值。 MIN: 找出每个分组中某列的最小值。 MAX: 找出每个分组中某列的最大值。...注意事项 GROUPING SETS 允许对多个列进行不同层次的分组,可以在一个查询中实现多个不同维度的聚合。...GROUPING SETS 是 SQL 中强大的聚合功能,通过一次查询实现多个不同层次的分组。它提供了更灵活的数据聚合选项,适用于需要在多个维度上进行统计和分析的场景。

    61210

    【数据库设计和SQL基础语法】--查询数据--聚合函数

    支持统计分析,如计算平均值、总和、最大值和最小值等。 用于处理大量数据,从而提高查询效率。 1.3 常见聚合函数 常见的聚合函数包括: COUNT:计算行数。 SUM:计算数值列的总和。...在数据统计和分析中具有广泛应用,通过不同的参数和条件组合,可以灵活地满足各种统计需求。 2.2 SUM 基本用法 SUM 函数用于计算查询结果集中某列的数值总和。...SUM: 计算每个分组中某列的总和。 AVG: 计算每个分组中某列的平均值。 MIN: 找出每个分组中某列的最小值。 MAX: 找出每个分组中某列的最大值。...注意事项 GROUPING SETS 允许对多个列进行不同层次的分组,可以在一个查询中实现多个不同维度的聚合。...GROUPING SETS 是 SQL 中强大的聚合功能,通过一次查询实现多个不同层次的分组。它提供了更灵活的数据聚合选项,适用于需要在多个维度上进行统计和分析的场景。

    62310

    【数据库设计和SQL基础语法】--查询数据--SELECT语句的基本用法

    数据排序: 使用ORDER BY子句对检索结果进行排序。 数据聚合: 支持聚合函数(如SUM、AVG、COUNT)对数据进行统计和汇总。 数据联接: 可以通过JOIN操作关联多个表的数据。...排序: 使用ORDER BY子句根据一列或多列对结果进行排序,可指定升序(ASC)或降序(DESC)。 聚合函数: 用于对数据进行统计,如SUM、AVG、COUNT等。...通过灵活组合以上元素,SELECT语句实现了对数据库中数据的灵活、高效的检索和处理,是SQL中最基础、重要的命令之一。理解和熟练掌握SELECT语句的使用对数据库查询操作至关重要。...ORDER BY: 对结果进行排序,可指定一个或多个列,以及升序(ASC)或降序(DESC)。..., total_amount FROM orders ORDER BY order_date DESC; -- 查询并使用聚合函数和GROUP BY SELECT department_id, AVG

    1.8K10

    PowerBI DAX 度量值管理 - 基本编写到高级管理

    归结起来,我们要解决的问题包括: 管理度量值编写的格式 管理度量值如何根据功能进行组织 管理度量值如何根据可复用架构进行组织 管理度量值的依赖关系 批量修改度量值 多人编写的分工和整合 我们会用几篇文章来描述这些问题如何在当前的...分隔,如: Customer.Count.New 【必】VAR 引导的变量使用 vAaBb 格式进行命名,使用 v 作为前缀,如: vItemsSelected 【必】DAX 表达式中的关键字(函数名,...符号等)使用大写英文字母,如: SUMX 【必】DAX 表达式中的函数与符号之间使用空格进行分隔,如: Sales = SUM( Order[Value] ) 【必】DAX 表达式中函数的开始括号与函数名称之前不使用空格...,如: Sales = SUM( Order[LinePrice] ) 【必】DAX 表达式采用 TAB 键和换行进行格式化,如: 【可选】命名空间,如: Start,并以 : 引导该命名空间下的内容,...同一个度量值可以在多个文件夹中 可以看到: ? 在[显示文件夹]里输入的信息可以通过 ; 分隔,那么就可以显示在两个文件夹里了。 通常在处理某个主题的时候,可以做这样的划分,例如: ?

    2.3K21

    Mysql| Mysql函数,聚集函数的介绍与使用(Lower,Date,Mod,AVG,...)

    3.用于处理日期和时间值并从这些值中提取特定成分(例如,返回两个日期之差,检查日期有效性等)的日期和时间函数。 4.返回DBMS正使用的特殊信息(如返回用户登录信息,检查版本细节)的系统函数。...虽然其他的日期格式可能也行,但这是首选的日期格式,因为它排除了多义性(如,04/05/06是2006年5月4日或2006年4月5日或2004年5月6日或…… 对比不使用时间函数和使用使用MySQL的时间函数效果...为了获得多个列的平均值,必须使用多个AVG()函数。 关于空值: NULL值 AVG()函数忽略列值为NULL的行。 ....对非数值数据使用MAX() 虽然MAX()一般用来找出最大的数值或日期值,但MySQL允许将它用来返回任意列中的最大值,包括返回文本列中的最大值。...关于空值: MIN()函数忽略列值为NULL的行  EG:SELECT MIN(prod_price) AS min_price FROM products; ⑤SUM()函数用法: SUM()用来返回指定列值的和

    1.5K10

    3分钟短文:Laravel模型集合跟基类真不一样,别混为一谈

    引言 laravel在功能拆分上相当灵活,其中查询返回的数据集,虽然继承了基类集合, 但是有一些特定的方法和用法。很多小白在写的时候,往往分不清到底是用的哪个类的哪个方法,导致凭空报错。...代码时间 laravel系统的基类就是 Illuminate\Support\Collection,同时提供了一个快捷助手函数collect 用于实例化一个集合类。...= $collection->reject(function ($item) { return $item % 2 === 0;}); reject方法接收一个匿名函数,满足条件的将被从集合中剔除...) { return $item * 10;})->sum(); 是不是比写foreach循环操作数组流畅直观的多了?...::all();$billableAmount = $orders->sumBillableAmount(); 注意使用all方法返回的是一个eloquent collection集合。

    1K40

    深入MySQL窗口函数:原理和应用

    窗口函数可以是聚合函数(如SUM、AVG等),也可以是专门为窗口函数设计的函数(如ROW_NUMBER、RANK等)。 OVER():定义窗口的框架。...当使用窗口函数 PERCENT_RANK() 和 CUME_DIST() 时,这些函数通常用于计算结果集中行的相对排名和累积分布。下面是一个示例,展示了如何在一个查询中同时使用这两个函数。...在这个例子中,prev_day_price 列显示了前一天的价格(使用 LAG 函数),next_day_price 列显示了后一天的价格(使用 LEAD 函数),first_day_price 列显示了整个记录期间的首日价格...三、常见的应用场景 窗口函数在多个场景中非常有用,以下是几个典型示例: 计算累计总和:使用SUM()函数和OVER()子句,可以轻松计算每一行的累计总和,这在分析销售数据、财务报表等方面非常有用。...使用索引:确保查询中涉及的列已正确索引,这有助于加速数据访问和计算过程。 避免嵌套窗口函数:嵌套窗口函数可能导致查询变得复杂并降低性能。如果可能,尝试将嵌套窗口函数拆分为多个独立的查询步骤。

    2.3K21

    使用R或者Python编程语言完成Excel的基础操作

    掌握基本操作:学习如何插入、删除行/列,重命名工作表,以及基本的数据输入。 使用公式:学习使用Excel的基本公式,如SUM、AVERAGE、VLOOKUP等,并理解相对引用和绝对引用的概念。...使用函数 使用逻辑、统计、文本、日期等函数:在单元格中输入如=SUM(A1:A10)、=VLOOKUP(value, range, column, [exact])等函数进行计算。...文本处理 文本分列:将一列数据根据分隔符分成多列。 合并文本:使用CONCATENATE函数或“&”运算符将多个单元格的文本合并为一个。 宏和VBA编程 录制宏:自动记录一系列操作,以便重复执行。...模板 使用模板:快速创建具有预定义格式和功能的表格。 高级筛选 自定义筛选条件:设置复杂的筛选条件,如“大于”、“小于”、“包含”等。 错误检查 追踪错误:找出公式中的错误来源。...~ Store + Month, data = sales, FUN = sum) # 按商店和日期排序 sales_monthly order(sales_monthly

    23810

    基于 Redis Geo 实现地理位置服务(LBS)中查找附近 XXX 的功能

    从 LBS 应用聊起 在移动互联网如火如荼的今天,各种 LBS(Location Based Service,基于地理位置服务)应用遍地开花,其核心要素是利用定位技术获取当前移动设备(手机)所在的位置...cafes Geo 结构中: Geo 底层使用的数据结构是 ZSET(有序集合),所以你可以在 Geo 上使用任何 ZSET 指令: 要删除某个 Geo 集合,使用 ZREM 指令即可,所以 Geo...通过 Geo 实现查找附近咖啡店功能 基于以上的介绍,想必你已经对如何在应用代码中实现「查找附近的XXX」功能胸有成竹了,以咖啡店应用为例,我们需要在新增咖啡店时将咖啡店名称及坐标信息维护到一个 Geo...需要注意的是,在 LBS 应用中,无论是车、餐馆、还是人,数量可能都是以千万、亿级计,每个维度的数据和坐标信息存放在一个键中,会导致单个键值特别大,如果超过亿级规模,则需要键做拆分,比如国家、省,以降低单个键的大小...本系列教程首发在Laravel学院(laravelacademy.org)

    3.7K20

    SQL中Group By的使用,以及一些特殊使用方法

    4、Group By 和 Order By 示例2 select 类别, sum(数量) AS 数量之和 from A group by 类别 order by sum(数量) desc 返回结果如下表...在Access中不可以使用“order by 数量之和 desc”,但在SQL Server中则可以。...“多列分组”实际上就是就是按照多列(类别+摘要)合并后的值进行分组,示例4中可以看到“a, a2001, 13”为“a, a2001, 11”和“a, a2001, 2”两条记录的合并。...having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。...compute子句能够观察“查询结果”的数据细节或统计各列数据(如例10中max、min和avg),返回结果由select列表和compute统计结果组成。

    2.7K20
    领券