前言:

最近在学习 laravel 框架,学习的版本是 7.15.0 ,记录一下学习过程中遇到的问题和难点以及一些总结。

目前,Laravel 支持四种类型的数据库系统:

MySQL 5.6+
Postgres 9.4+
SQLite 3.8.8+
SQL Server 2017+

在 laravel 框架中的 .env 中配置数据库的连接项。
以 MySQL 为例

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=root
DB_PASSWORD="123456"

使用原生 SQL 语句
配置好数据库连接后,就可以使用 DB 门面来运行查询。DB 门面为每种操作提供了相应方法:select, update, insert, delete 和 statement。

运行一个通用语句
有些数据库语句不返回任何值,比如新增表,修改表,删除表等,对于这种类型的操作,可以使用 DB 门面的 statement 方法:

DB::statement('drop table users');

数据库事务
使用 DB 门面的 transaction 方法,使用 transaction 方法时不需要手动回滚或提交:如果事务闭包中抛出异常,事务将会自动回滚;如果闭包执行成功,事务将会自动提交:

DB::transaction(function () {
//数据库操作
});

手动使用事务

DB::beginTransaction();//开启事务
DB::rollBack();//回滚事务
DB::commit();//提交事务

查询构建器
get 方法获取表中所有记录

/**
     * @param Request $request
     * @return \Illuminate\Contracts\Foundation\Application
     * @return \Illuminate\Contracts\View\Factory
     * @return \Illuminate\View\View
     */
    public function testData(Request $request)
    {
        $users = DB::table('admin')->get();
        dd($users);
    }

get 方法返回包含结果集的 Illuminate\Support\Collection,其中每一个结果都是 PHP 的 StdClass 对象实例

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

从一张表中获取一行/一列
使用 first 方法,该方法将会返回单个 StdClass 对象。

$user = DB::table('admin')->where('name', '测试1')->first();
echo $user->name;//输出 测试1

使用 value 方法从结果中获取单个值,该方法会直接返回指定列的值。

$username = DB::table('admin')->where('name', '测试1')->value('username');
dd($username);

使用find方法通过 id 字段来获取单条记录。
注意:使用 id 字段,相应的数据库中表的主键也需要设置为 id

$user = DB::table('admin')->find(3);
dd($user);

获取字段值列表
使用 pluck 方法获取包含单个字段值的数组。

$names = DB::table('admin')->pluck('name');//类似于Thinkphp中的column
dd($names);

在返回数组中为列值指定自定义键,该自定义键必须是该表的其它字段列名,否则会报错。

$names = DB::table('admin')->pluck('name','key');//key为键值,name为值
dd($names);

组块结果集
使用 chunk 方法,该方法一次获取结果集的一小块,然后传递每一小块数据到闭包函数进行处理。

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

聚合函数
查询构建器还提供了多个聚合方法,如count, max, min, avg 和 sum。
查询 Select
指定查询子句

$users = DB::table('admin')->select('name', 'username as nickname', 'phone')->get();
foreach ($users as $user) {
    echo $user->phone;
}

distinct 方法允许你强制查询返回不重复的结果集。

$users = DB::table('admin')->distinct()->get();

使用 addSelect 方法添加一个查询列到已存在的 select 子句。

$query = DB::table('admin')->select('name');
$users = $query->addSelect('phone')->get();
dd($users);

连接 Join
join 内连接、leftJoin 左连接、rightJoin 右连接。
联合 Union
使用 union 方法将其和第二个查询进行联合。

$first = DB::table('admin')
    ->whereNotNull('name');

$users = DB::table('admin')
    ->whereNotNull('username')
    ->union($first)
    ->get();
dd($users);

Where 子句

where('votes', '=', 100)
->where('votes', '>=', 100)
->where('votes', '<>', 100)
->where('name', 'like', 'T%')
->where([
    ['status', '=', '1'],
    ['subscribed', '<>', '1'],
])

or 语句

->where('votes', '>', 100)
->orWhere('name', 'John')

//or分组,闭包写法
->where('votes', '>', 100)
->orWhere(function($query) {
    $query->where('name', 'Abigail')
          ->where('votes', '>', 50);
})

whereBetween 方法验证列值是否在给定值之间
whereNotBetween 方法验证列值不在给定值之间
whereIn 方法验证给定列的值是否在给定数组中
whereNotIn 方法验证给定列的值不在给定数组中
whereNull 方法验证给定列的值为 NULL
whereNotNull 方法验证给定列的值不是 NULL
whereDate 方法用于比较字段值和日期
whereMonth 方法用于比较字段值和一年中的指定月份
whereDay 方法用于比较字段值和一月中的指定日期
whereYear 方法用于比较字段值和指定年
whereTime 方法用于比较字段值和指定时间
whereColumn 方法用于验证两个字段是否相等

排序、分组、限定
orderBy 方法允许你通过给定字段对结果集进行排序 asc 或 desc。

$users = DB::table('admin')
 ->orderBy('key', 'desc')
 ->get();
dd($users);

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

插入 Insert
insert 方法用于插入记录到数据表。
insertOrIgnore 方法会在插入记录到数据库时忽略重复记录错误。
insertGetId 方法来插入记录并返回ID值。

更新 Update
update 方法和 insert 方法一样,接收字段名和字段值的键值对数组。
updateOrInsert 方法首先会尝试使用第一个参数的列值对匹配对应的数据库记录,如果记录存在,则通过第二个参数来更新它。如果记录不存在,则会合并这两个参数数组然后通过合并后的数组插入一条新纪录。

删除 Delete
delete 根据条件进行删除数据,删除所有列并将自增 ID 置为 0,可以使用 truncate。

数据分页
查询中调用 paginate 方法,参数为每页的条数。传值参数需要加上 page 代表当前页码。

//需要传递参数 page 表示页码,当前每页10条数据
$users = DB::table('admin')->paginate(10);
dd($users);

简单分页 simplePaginate