前言:
最近在学习 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