Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()

Laravel 5.5

Linux mint 18

PHPStorm

最近刚玩Laravel,手册源码还没来得及看完就跃跃欲试做了个小项目,其中有个需求是分组查询数据库中的一个字段并返回每个分组中的数量,还是去翻手册(手册确实够简单):

groupBy 和 having 方法可用来对查询结果进行分组。having 方法的用法和 where 方法类似:
$users = DB::table('users')
   ->groupBy('account_id')
   ->having('account_id', '>', 100)
   ->get();

网上去查,发现一个轮子

$user_info = DB::table('usermetas')
    ->select('browser', DB::raw('count(*) as total'))
    ->groupBy('browser')
    ->get();

再去查手册

## 指定一个 Select 子句#

当然,你并不会总是想从数据表中选出所有的字段。这时可使用 select 方法自定义一个 select 子句来查询指定的字段:

$users = DB::table('users')->select('name', 'email as user_email')->get();

## 原始表达式#

有时候你可能需要在查询中使用原始表达式。这些表达式将会被当作字符串注入到查询中,所以要小心避免造成 SQL 注入攻击!要创建一个原始表达式,可以使用 DB::raw 方法:

$users = DB::table('users')
     ->select(DB::raw('count(*) as user_count, status'))
     ->where('status', '<>', 1)
     ->groupBy('status')
     ->get();

可惜总是爱折腾,不想着用点奇迹淫巧就对不起自己这手艺人,于是有了:

$sql = Data::raw('count(*) as value');

$obj = self::whereBetween('modified',[$begin,$end])->select('city as name',$sql)
            ->groupBy('city')
            ->get()
            ->toArray();

代码也不客气了,直接撂了挑子:

毛病出在这句身上:

$sql = Data::raw('count(*) as value'); 

我用了个Data(Model),返回的是个Builder对象,而此处却要一个字符串,所以改回了

$sql = DB::raw('count(*) as value');

此时$sql是个string,至于有木有办法在此处用Model,慢慢研究吧,任重道远!

参考:

Laravel Eloquent groupBy() AND also return count of each group

以上这篇Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Laravel关系模型指定条件查询方法

    对于关系模型来说,有时候我们需要甄别关联后结果,例如,班级和学生是一对多关联,我现在查询班级,但是想只显示正常状态,即状态为1的学生,因为有的学生从这个班级里面删除了,状态是4,那么我们在查询的时候就可以使用如下语法: 1.定义关联关系: Class模型: public function learners() { return $this->belongsToMany('App\Models\Customer', 'learner_relation', 'class_id', 'learner_

  • 解决laravel查询构造器中的别名问题

    Laravel框架对数据库的封装是比较完善的,用起来也比较方便.但之前有一个问题一直困扰着我,就是利用laravel作查询时.如果想给表名或是字段名起别名是比较麻烦的事.但翻阅它的文档不难发现,它提供了一个DB::raw()的方法给我们,利用这个方法,我们就可以轻松的实现对表的重命名. 问题还原: 一般的写法:DB::table('users')->select('id','username')->get(); 这样写是一点问题没有的. 加别名的写法:DB::table('users as t

  • laravel 获取当前url的别名方法

    如下所示: Route::get('/xiongtest', [ 'as' => 'xiong.test', 'uses' => 'XiongTestController@index' ]); 以上路由为例 在模版中可以使用route('xiong.test')来获取该路由的真实地址. 在XiongTestController@index中,可以使用以下方法获取路由别名 public function index(Request $request) $routeAction = $reques

  • 详解Laravel设置多态关系模型别名的方式

    作为 Laravel 的重度使用者肯定都对多态关系不默生,以官方文档为例,文章有标签,视频有标签,那么文章和视频这些模型与标签模型的关系就是 多态多对多(Many To Many (Polymorphic)) 如果我们给 ID 为 1 的文章打上两个标签,数据库标签关系表的的存储结果就是这样子: > select * from taggables; +--------+-------------+---------------+ | tag_id | taggable_id | taggable

  • Laravel 模型使用软删除-左连接查询-表起别名示例

    事情是这样的,有天写了一个左连接查询,由于表名太长,所以分别给起个别名,代码如下: public function detail() { $result = TakeOrderModel::query() ->from('take_order as order') ->leftJoin('take_order_detail as detail', 'order.id', '=', 'detail.take_order_id') ->get(); dd($result); } 执行后,报错

  • Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()

    Laravel 5.5 Linux mint 18 PHPStorm 最近刚玩Laravel,手册源码还没来得及看完就跃跃欲试做了个小项目,其中有个需求是分组查询数据库中的一个字段并返回每个分组中的数量,还是去翻手册(手册确实够简单): groupBy 和 having 方法可用来对查询结果进行分组.having 方法的用法和 where 方法类似: $users = DB::table('users') ->groupBy('account_id') ->having('account_id

  • 使用laravel的Eloquent模型如何获取数据库的指定列

    使用Laravel的ORM--Eloquent时,时常遇到的一个操作是取模型中的其中一些属性,对应的就是在数据库中取表的特定列. 如果使用DB门面写查询构造器,那只需要链式调用select()方法即可: $users = DB::table('users')->select('name', 'email as user_email')->get(); 使用Eloquent的话,有两种方式: 使用select() $users = User::select(['name'])->get()

  • laravel 之 Eloquent 模型修改器和序列化示例

    修改器 获取 <?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { public function getFirstNameAttribute($value) { return ucfirst($value); } } 使用 Laravel 加密器 来加密一个被保存在数据库中的值,当你从 Eloquent 模型访问该属性时该值将被自动解密. $user = App\User:

  • 解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题

    问题描述:在使用laravel的左联接查询的时候遇到一个问题,查询中带了右表一个筛选条件,导致结果没有返回右表为空的记录. 先附上代码: DB::table('users as u') ->select('u.user_id','c.class') ->leftJoin('class as c','c.user_id','=','u.user_id') ->where('c.status','=',2) ->get(); 解决方案: 1.在mysql的角度上说,直接加where条件

  • MySQL学习之分组查询的用法详解

    目录 为什么要分组 逐级分组 逐级分组对 SELECT 子句的要求 对分组结果集再次做汇总计算 GROUP_CONCAT 函数 GROUP BY 子句的执行顺序 该章节来开始学习分组查询,上一章节我们学习了聚合函数,默认统计的是全表范围内的数据,配合上 WHERE 就能够缩小统计的范围了.但是这并不能满足我们的要求,比如说我们按照之前的数据表查询每个部门的平均底薪是多少?这样的记录就需要针对部门编号进行分组了.根据分组的情况统计分组内的最大值.最小值.平均值等等.如此就能够满足刚刚提到的 “查询

  • mysql按照时间分组查询的语句

    mysql 按年.月.周.日分组查询 1.按照年份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y') month_time,sum(t.pay_price) total FROM f_bill t GROUP BY month_time; 查询结果 2.按照月份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y-%m') month_time,sum(t.pay_price) total FROM f_bill t GROUP BY m

  • Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解

    本文实例讲述了Laravel框架Eloquent ORM简介.模型建立及查询数据操作.分享给大家供大家参考,具体如下: 注:以下知识点可能有不全面之处,望见谅 NO.1Eloquent ORM简介 Laravel所自带的Eloquent ORM是一个优美.简洁的ActiveRecord实现,用来实现数据库操作 每个数据表都有与之相对应的"模型(Model)"用于和数据交互 NO.2模型的建立 最基础的模型代码如下: namespace App; use Illuminate\Datab

  • laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析

    本文实例讲述了laravel框架数据库操作.查询构建器.Eloquent ORM操作.分享给大家供大家参考,具体如下: 1.连接数据库 laravel连接数据库的配置文件位于config/database.php中,在其中connection字段中包含laravel所支持的数据库的配置信息,可以看到其中有主机.端口.数据库.用户名.密码等信息: 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_HOST', 'localhost'),

  • laravel 判断查询数据库返回值的例子

    在使用 Laravel Eloquent 模型时,我们可能要判断取出的结果集是否为空,但我们发现直接使用 is_null 或 empty 是无法判段它结果集是否为空的. var_dump 之后我们很容易发现,即使取到的空结果集, Eloquent 仍然会返回 Illuminate\Database\Eloquent\Collection 对象实例. 其实,Eloquent 已经给我们封装几个判断方法. $result = Model::where(...)->get(); //不为空则 if (

  • Python模型聚合查询\Q查询\F查询\分组查询操作技巧解析

    目录 模型中的一些查询操作: 1.聚合查询:aggregate()是QuerySet 的一个终止子句 2.Q查询: 如果你需要执行更复杂的查询(例如OR语句) 3.F查询: (查询的是一整列数据!) 4.分组查询 4.1一对多关系 4.2多对多关系 模型中的一些查询操作: 1.聚合查询:aggregate()是QuerySet 的一个终止子句 它返回一个包含一些键值对的字典 from movie.models import User from django.db.models import Co

随机推荐