Laravel 5.2 数据库查询的例子

1、简介

数据库查询构建器提供了一个方便的、平滑的接口来创建和运行数据库查询。查询构建器可以用于执行应用中大部分数据库操作,并且能够在支持的所有数据库系统上工作。

注意:Laravel 查询构建器使用 PDO 参数绑定来避免 SQL 注入攻击,不再需要过滤传递到绑定的字符串。
2、获取结果集

从一张表中取出所有行

在查询之前,使用DB门面的table方法,table方法为给定表返回一个查询构建器,允许你在查询上链接更多约束条件并最终返回查询结果。在本例中,我们使用get方法获取表中所有记录:

<?php

namespace App\Http\Controllers;

use DB;
use App\Http\Controllers\Controller;

class UserController extends Controller{
    /**
     * 显示用户列表
     *
     * @return Response
     */
    public function index()
    {
        $users = DB::table('users')->get();

        return view('user.index', ['users' => $users]);
    }
}
和原生查询一样,get方法返回结果集的数组,其中每一个结果都是PHP对象的StdClass实例。你可以像访问对象的属性一样访问列的值:

foreach ($users as $user) {
    echo $user->name;
}

从一张表中获取一行/一列

如果你只是想要从数据表中获取一行数据,可以使用first方法,该方法将会返回单个StdClass对象:

$user = DB::table('users')->where('name', 'John')->first();

echo $user->name;
如果你不需要完整的一行,可以使用value方法从结果中获取单个值,该方法会直接返回指定列的值:

$email = DB::table('users')->where('name', 'John')->value('email');

从一张表中获取组块结果集

如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的 Artisan 命令的时候非常有用。比如,我们可以将处理全部 users 表数据处理成一次处理 100 记录的小组块:

DB::table('users')->chunk(100, function($users) {
    foreach ($users as $user) {
        //
    }
});

你可以通过从闭包函数中返回false来中止组块的运行:

DB::table('users')->chunk(100, function($users) {
    // 处理结果集...
    return false;
});
获取数据列值列表

如果想要获取包含单个列值的数组,可以使用lists方法,在本例中,我们获取所有title的数组:

$titles = DB::table('roles')->lists('title');

foreach ($titles as $title) {
    echo $title;
}
在还可以在返回数组中为列值指定更多的自定义键(该自定义键必须是该表的其它字段列名,否则会报错):

$roles = DB::table('roles')->lists('title', 'name');

foreach ($roles as $name => $title) {
    echo $title;
}

聚合函数

队列构建器还提供了很多聚合方法,比如count, max, min, avg, 和 sum,你可以在构造查询之后调用这些方法:

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
当然,你可以联合其它查询子句和聚合函数来构建查询:

$price = DB::table('orders')
                ->where('finalized', 1)
                ->avg('price');

3、查询(Select)

指定查询子句

当然,我们并不总是想要获取数据表的所有列,使用select方法,你可以为查询指定自定义的select子句:

$users = DB::table('users')->select('name', 'email as user_email')->get();
distinct方法允许你强制查询返回不重复的结果集:

$users = DB::table('users')->distinct()->get();
如果你已经有了一个查询构建器实例并且希望添加一个查询列到已存在的select子句,可以使用addSelect方法:

$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
原生表达式

有时候你希望在查询中使用原生表达式,这些表达式将会以字符串的形式注入到查询中,所以要格外小心避免被 SQL 注入。想要创建一个原生表达式,可以使用 DB::raw方法:

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

内连接(等值连接)

查询构建器还可以用于编写基本的SQL“内连接”,你可以使用查询构建器实例上的join方法,传递给join方法的第一次参数是你需要连接到的表名,剩余的其它参数则是为连接指定的列约束,当然,正如你所看到的,你可以在单个查询中连接多张表:

$users = DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.*', 'contacts.phone', 'orders.price')
            ->get();
左连接

如果你是想要执行“左连接”而不是“内连接”,可以使用leftJoin方法。该方法和join方法的使用方法一样:

$users = DB::table('users')
            ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
            ->get();
高级连接语句

你还可以指定更多的高级连接子句,传递一个闭包到join方法作为该方法的第2个参数,该闭包将会返回允许你指定join子句约束的JoinClause对象:

DB::table('users')
        ->join('contacts', function ($join) {
            $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
        })
        ->get();
如果你想要在连接中使用“where”风格的子句,可以在查询中使用where和orWhere方法。这些方法将会将列和值进行比较而不是列和列进行比较:

DB::table('users')
        ->join('contacts', function ($join) {
            $join->on('users.id', '=', 'contacts.user_id')
                 ->where('contacts.user_id', '>', 5);
        })
        ->get();

5、联合(Union)

查询构建器还提供了一条“联合”两个查询的快捷方式,比如,你要创建一个独立的查询,然后使用union方法将其和第二个查询进行联合:

$first = DB::table('users')
            ->whereNull('first_name');

$users = DB::table('users')
            ->whereNull('last_name')
            ->union($first)
            ->get();
unionAll方法也是有效的,并且和union有同样的使用方法。

6、Where子句

简单where子句

使用查询构建器上的where方法可以添加where子句到查询中,调用where最基本的方法需要三个参数,第一个参数是列名,第二个参数是一个数据库系统支持的任意操作符,第三个参数是该列要比较的值。

例如,下面是一个验证“votes”列的值是否等于100的查询:

$users = DB::table('users')->where('votes', '=', 100)->get();
为了方便,如果你只是简单比较列值和给定数值是否相等,可以将数值直接作为where方法的第二个参数:

$users = DB::table('users')->where('votes', 100)->get();
当然,你可以使用其它操作符来编写where子句:

$users = DB::table('users')
                ->where('votes', '>=', 100)
                ->get();

$users = DB::table('users')
                ->where('votes', '<>', 100)
                ->get();

$users = DB::table('users')
                ->where('name', 'like', 'T%')
                ->get();
or

你可以通过方法链将多个where约束链接到一起,也可以添加or子句到查询,orWhere方法和where方法接收参数一样:

$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();
更多Where子句

whereBetween

whereBetween方法验证列值是否在给定值之间:

$users = DB::table('users')
                    ->whereBetween('votes', [1, 100])->get();
whereNotBetween

whereNotBetween方法验证列值不在给定值之间:

$users = DB::table('users')
                    ->whereNotBetween('votes', [1, 100])
                    ->get();
whereIn/whereNotIn

whereIn方法验证给定列的值是否在给定数组中:

$users = DB::table('users')
                    ->whereIn('id', [1, 2, 3])
                    ->get();
whereNotIn方法验证给定列的值不在给定数组中:

$users = DB::table('users')
                    ->whereNotIn('id', [1, 2, 3])
                    ->get();
whereNull/whereNotNull

whereNull方法验证给定列的值为NULL:

$users = DB::table('users')
                    ->whereNull('updated_at')
                    ->get();
whereNotNull方法验证给定列的值不是NULL:

$users = DB::table('users')
                    ->whereNotNull('updated_at')
                    ->get();
高级Where子句

参数分组

有时候你需要创建更加高级的where子句比如“where exists”或者嵌套的参数分组。Laravel查询构建器也可以处理这些。作为开始,让我们看一个在括号中进行分组约束的例子:

DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function ($query) {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();
正如你所看到的,传递闭包到orWhere方法构造查询构建器来开始一个约束分组,,该闭包将会获取一个用于设置括号中包含的约束的查询构建器实例。上述语句等价于下面的SQL:

select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
exists语句

whereExists方法允许你编写where existSQL子句,whereExists方法接收一个闭包参数,该闭包获取一个查询构建器实例从而允许你定义放置在“exists”子句中的查询:

DB::table('users')
            ->whereExists(function ($query) {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();
上述查询等价于下面的SQL语句:

select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)

7、排序、分组、限定

orderBy

orderBy方法允许你通过给定列对结果集进行排序,orderBy的第一个参数应该是你希望排序的列,第二个参数控制着排序的方向——asc或desc:

$users = DB::table('users')
                ->orderBy('name', 'desc')
                ->get();
groupBy / having / havingRaw

groupBy和having方法用于对结果集进行分组,having方法和where方法的用法类似:

$users = DB::table('users')
                ->groupBy('account_id')
                ->having('account_id', '>', 100)
                ->get();
havingRaw方法可以用于设置原生字符串作为having子句的值,例如,我们要找到所有售价大于$2500的部分:

$users = DB::table('orders')
                ->select('department', DB::raw('SUM(price) as total_sales'))
                ->groupBy('department')
                ->havingRaw('SUM(price) > 2500')
                ->get();
skip / take

想要限定查询返回的结果集的数目,或者在查询中跳过给定数目的结果,可以使用skip和take方法:

$users = DB::table('users')->skip(10)->take(5)->get();

8、插入(Insert)

查询构建器还提供了insert方法来插入记录到数据表。insert方法接收数组形式的列名和值进行插入操作:

DB::table('users')->insert(
    ['email' => 'john@example.com', 'votes' => 0]);
你甚至可以一次性通过传入多个数组来插入多条记录,每个数组代表要插入数据表的记录:

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],
    ['email' => 'dayle@example.com', 'votes' => 0]
]);
自增ID

如果数据表有自增ID,使用insertGetId方法来插入记录将会返回ID值:

$id = DB::table('users')->insertGetId(
    ['email' => 'john@example.com', 'votes' => 0]
);
注意:当使用PostgresSQL时insertGetId方法默认自增列被命名为id,如果你想要从其他“序列”获取ID,可以将序列名作为第二个参数传递到insertGetId方法。
9、更新(Update)
当然,除了插入记录到数据库,查询构建器还可以通过使用update方法更新已有记录。update方法和insert方法一样,接收列和值的键值对数组包含要更新的列,你可以通过where子句来对update查询进行约束:

DB::table('users')
            ->where('id', 1)
            ->update(['votes' => 1]);
增加/减少

查询构建器还提供了方便增减给定列名数值的方法。相较于编写update语句,这是一条捷径,提供了更好的体验和测试接口。

这两个方法都至少接收一个参数:需要修改的列。第二个参数是可选的,用于控制列值增加/减少的数目。

DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);
在操作过程中你还可以指定额外的列进行更新:

DB::table('users')->increment('votes', 1, ['name' => 'John']);
10、删除(Delete)
当然,查询构建器还可以通过delete方法从表中删除记录:

DB::table('users')->delete();
在调用delete方法之前可以通过添加where子句对delete语句进行约束:

DB::table('users')->where('votes', '<', 100)->delete();
如果你希望清除整张表,也就是删除所有列并将自增ID置为0,可以使用truncate方法:

DB::table('users')->truncate();

11、悲观锁

查询构建器还包含一些方法帮助你在select语句中实现“悲观锁”。可以在查询中使用sharedLock方法从而在运行语句时带一把”共享锁“。共享锁可以避免被选择的行被修改直到事务提交:

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
此外你还可以使用lockForUpdate方法。“for update”锁避免选择行被其它共享锁修改或删除:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();

 

时间: 2025-01-19 09:40:33

Laravel 5.2 数据库查询的例子的相关文章

模糊查询 含通配符-请问谁有stuts2模糊查询的例子啊?要点击获取数据库的,求…

问题描述 请问谁有stuts2模糊查询的例子啊?要点击获取数据库的,求- 如果你有,请发我邮箱,40c币感谢,谢谢!zhangwenh1228@163.com 解决方案 你是要struts2模糊查询相应的action 还是 要到数据库模块查询呢? 如果要到数据库查询 你自己写SQL就可以了 解决方案二: 郁闷,我都悬赏40c也没人给我发呢么-- 解决方案三: stuts2不会直接操作数据库,你要的模糊查询它只能传递下参数给dao层,模糊查询要在dao层的框架写

【MYSQL数据库开发之四】MYSQL NULL值操作、批处理模式、常用查询的例子、计数行、模式匹配等

本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/mysql/781.html 继续上一篇继续讲解MySQL的相关知识点:      1. NULL 值操作: NULL值可能令人感到奇怪直到你习惯它.概念上,NULL意味着"没有值"或"未知值",且它被看作与众不同的值.为了测试NULL,你不能使用算术比较 操作符例如=.<或!=.为了说明它,试试下列查询:

Laravel使用Caching缓存数据减轻数据库查询压力的方法_php实例

本文实例讲述了Laravel使用Caching缓存数据减轻数据库查询压力的方法.分享给大家供大家参考,具体如下: 昨天想把自己博客的首页做一下缓存,达到类似于生成静态页缓存的效果,在群里问了大家怎么做缓存,都挺忙的没多少回复,我就自己去看了看文档,发现了Caching这个部分,其实之前也有印象,但是没具体接触过,顾名思义,就是缓存了,那肯定和我的需求有点联系,我就认真看了看,发现的确是太强大了,经过很简单的几个步骤,我就改装好了首页,用firebug测试了一下,提高了几十毫秒解析时间,当然了有人

laravel框架缓存使用配置与例子

基础介绍 假设您的应用程序显示了十个最流行的歌曲提供给用户投票评选. 你真的需要在用户每次访问时否访问这十首歌曲吗?如果你可以存储10分钟的歌曲, 甚至一个小时以便大大加快您的应用程序, 该怎么办?使用 laravel缓存会变得非常简单. laravel提供五个缓存的驱动模式: •文件系统 •数据库 •Memcached •APC •Redis •内存 (Arrays) 默认情况下, Laravel被配置为使用文件系统缓存驱动, 这是不需要配置的. 文件系统驱动把缓存项作为文件存储在storag

看实例学VFP:对时间段进行查询的例子

这个例子应用到了select语句中的between...and子句的知识,关于select语句请参考:select SQL 命令 或sql语言教程. 本例运行时如下图: 本例用到了"数据1"数据库中的"人员信息表",关于该数据库的情况已经在看实例学VFP:示例数据库一文中给出,这里不再详述.   制作步骤如下: 一.新建表单,将其caption属性值设为"对时间段进行查询的例子",width属性值设为290,height属性值设为195,Auto

如何使用SQL Server数据库查询累计值

本文介绍如何使用SQL Server数据库查询累计值,举例分析. 有这样一个要求,它要创建一个SQL Server查询,其中包括基于事件时刻的累计值.典型的例子就是一个银行账户,因为你每一次都是在不同的时间去存钱和取钱.对任意一个账户来说,在某个时间点都要算出它的借(存款)和贷(取款)之和.每一笔交易之后,你都想知道当前的余额. 列表A创建了这样一个表格的简单的例子. CREATETABLE [dbo].[BankAccount]([TransactionID] [int] IDENTITY(1

多条件数据库查询的优化方法

在数据库编程中,管理人员需要经常从数据库中查询数据.当查询条件为确定时,我们可以明确用的SQL语句来实现,但是当查询条件为多个条件的动态组合时,查询语句会由于分支太多及IF语句的多重嵌套而变得相当复杂.在此,笔者提供了一种优化方法,运用本方法可以有效地减少查询语句的分支和数量以及IF条件语句的嵌套层数,从而提高程序的运行效率. 下面我们以一个简单的例子来说明,假设有一个名为employee的表,现在我们要从其中查询数据,条件有三个,由用户动态选择,如图1所示: 其中条件A.B.C之间是与的关系,

关于mysql数据库查询统计的问题

问题描述 关于mysql数据库查询统计的问题 两张表 eadept,oi_professional eadept表有两列 deptid(单位代码) deptname(单位名称) ENABLED(是否启用) oi_profession表 有四列 id(序号) proname(人员姓名) deptid(单位代码) sex(性别) 我想写一个统计sql语句,能查询统计 deptid,deptname,(人员总数量),(女员工数量),(男员工数量) ps.部门有上下级 例子A部门代码deptid为001

大数据量下的数据库查询与插入如何优化? (整理)

数据库经常要做一些查询与插入,但是如果查询和插入的数据量过大的时候就会引发数据库性能问题,降低数据库工作效率.因此性能调优是大家在工作中都能够预见的问题,大到世界五百强的核心系统,小到超市的库存系统,几乎都会有要调优的时候.面对形形色色的系统,林林总总的需求,调优的手段也是丰富多彩. 1.尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询 2.避免频繁创建和删除临时表,以减少系统表资源的消耗. 3.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理. 4.建立高效的索引