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