使用Laravel中的查询构造器实现增删改查功能


Posted in PHP onSeptember 03, 2019

引言

上一篇介绍了如何在windows环境下跑一个 laravel 项目,这一篇写如何使用 laravel 中的 查询构造器 实现增删改查。

读这篇文章时我默认你已拥有如下知识:

  • 了解php的基础语法
  • 了解数据库设计
  • 了解常用的sql查询

正文

实现增删改查前, 我们先准备一些步骤:

  • php, nginx, mysql 服务正确启用
  • 新建一个数据库及其数据表

开启服务我们打开上篇文章介绍的 Wnmp.exe -> Start all

然后cmd上键入命令:

D:/wnmp/Wnmp/php/php-cgi.exe -b 127.0.0.1:9000 -c D:/wnmp/Wnmp/php/php.ini

新建一个数据库, 我命名为 shop , 然后新建两张表

分别:

goods -> 商品表 user -> 用户表

数据表新建完成后, 我往里面随意插入了几条数据, 下图:

使用Laravel中的查询构造器实现增删改查功能

使用Laravel中的查询构造器实现增删改查功能

准备步骤已经完成, 我们打开上篇文章介绍的 testLaravel 项目

查看Laravel文档能够知道 数据库配置config/database.php 里,

因为我们是mysql数据库, 所以找到对应的mysql选项:

使用Laravel中的查询构造器实现增删改查功能

查看 database.php 文件的mysql配置我们能够看到配置值是 变量 , 指向的是项目根目录的 .env 文件

打开 .env 文件, 我们填写对应的mysql真实配置, 下图:

使用Laravel中的查询构造器实现增删改查功能

配置大家看对应的key值就知道是什么含义了, 这里提下数据库密码, 为什么是 password 呢? 查看Wnmp安装目录, 我们能看到有一个 readme.txt 的文件, 文件的文本内容如下:

Copyright (c) 2012 - 2019, Kurt Cancemi (kurt@x64architecture.com)
Donations are appreciated no matter if big or small.
https://wnmp.x64architecture.com/donate/

Wnmp is an easy Nginx, MariaDB and PHP environment for Windows.

The default login for MySQL/MariaDB/phpMyAdmin is: 
username: root
password: password

Note: you can change it via phpMyAdmin

根据文件内容 我们知道了密码是: password , 因为是本地开发环境 这里就不更改密码了,

但如果是生产环境, 大家使用集成环境包的时候一定要变更数据库密码.

另外文中没有介绍项目的具体目录结构, 建议大家看下官方文档, 熟悉一下.

到这里项目的数据库配置就已经配完了, 关联了本地的 shop 数据库.

现在我们需要配置一下 路由 , 所有的 Laravel 路由 的配置都在根目录的 routes 里, routes 目录中有4个路由配置文件, 这里不谈其中区别, 只关注 web.php , 后面所有路由我们都在此文件里追加.

看到这里的同学也建议看一下 laravel 的路由文档, 因为文中讲的不是很细, 传送门:

https://learnku.com/docs/lara...

顺便一说, 我个人选择 laravel 作为深入学习的php框架, laravel优雅的路由是我选择它的一个重要原因.

我这里先写几个路由, 大家感受一下:

Route::get('test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::post('test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::get('test/queryUsers/{id}',['uses' => 'TestController@queryUsers']);

Route::match(['get','post'],'test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::any('test/queryUsers',['uses' => 'TestController@queryUsers']);

我们知道熟知的http请求方式有 getpost 两种.

a. 我们来依次解析上面的路由, 先看第1条:

Route::get('test/queryUsers',['uses' => 'TestController@queryUsers']);

此路由指定了 get 方式请求, 路由为 test/queryUsers , 逻辑会走向 TestController 控制器的 queryUsers 方法

这里出现了两个名词 控制器方法

注: laravel是一个 mvc框架 , 关于 mvc 的理解需要自己查些资料看看.

查询

控制器在项目里的 App/Http/Controllers 目录里, 这里我新增一个 TestController 控制器, TestController 里新增一个 queryUsers 方法:

<?php

namespace App\Http\Controllers;
use app\Member;
use Illuminate\Support\Facades\DB;
use Symfony\Component\Routing\Annotation\Route;

class TestController extends Controller
{
 public function queryUsers() {
 $users = DB::table('user')->get();
 return $users;
 }
}

我们先来看结果, 地址栏键入(域名 + 路由): http://test.lara.com/test/queryUsers :

使用Laravel中的查询构造器实现增删改查功能

代码里很亮眼的一行:

DB::table('user')->get();

这行代码表示查询 shop数据库 user 表的全部数据, 所以我们看到 user 表中的3条记录都被返回了.

b. 现在我们来解析上面路由的第2条:

Route::post('test/queryUsers',['uses' => 'TestController@queryUsers']);

这条路由和第1条路由只有一个 post 的区别, 没错, 这是一个post请求的路由, 我们知道post请求方式无法在浏览器地址栏键入路由来得到结果, 所以我们需要使用一个工具 Postman , 这是个好东西, 如果有同学没用过或是不知道它, 建议查一下熟悉一下, 文中不介绍它.

现在我们在 Postman 新建一个请求, 如图:

使用Laravel中的查询构造器实现增删改查功能

我们点击 send 得到 :

使用Laravel中的查询构造器实现增删改查功能

纳尼?怎么没有得到我们期望的结果, 很显然哪里不对,我们再来看看路由的文档:

https://learnku.com/docs/lara...

文档中我查找与 post 字眼的相关马迹, 看到:

使用Laravel中的查询构造器实现增删改查功能

原来是 CSRF 造成的, 无论是前端同学还是后端同学, 应该都对这个词不陌生, 跨站请求伪造

laravel 中为了解决 CSRF 这个隐患, 默认有保护机制, 我们需要配置 CSRF 白名单 , 根据文档, 我们知道 CSRF 白名单 的配置在 VerifyCsrfToken 中间件里, VerifyCsrfToken 中间件所在路径:

App/Http/Middleware/VerifyCsrfToken.php

打开文件, 添加 CSRF 白名单 ,

protected $except = [
 'http://test.lara.com/test/queryUsers',
 ];

完成这步后我们再打开 postman, 点击 send 可以看到数据如期望返回:

使用Laravel中的查询构造器实现增删改查功能

c. 现在我们来解析上面路由的第3条:

Route::get('test/queryUsers/{id}',['uses' => 'TestController@queryUsers']);

可以看出这条路由的区别在于路由末尾的 {id} , 开发中我们会有这样的需求, 前端传递一个用户id, 后端返回这个id对应的该用户信息

此时需要修改下 TestController 控制器 queryUsers 方法:

public function queryUsers() {
 $id = request()->id; // 此种方式获取参数
 $users = DB::table('user')->where('id', $id)->get();
 return json_encode($users);
 }

白话文解释一下这条sql: 在table表里查询id = $id(路由传递的值)的记录,

查看结果, 符合预期:

使用Laravel中的查询构造器实现增删改查功能

d. 现在我们来解析上面路由的第4条和第5条:

Route::match(['get','post'],'test/queryUsers',['uses' => 'TestController@queryUsers']);
Route::any('test/queryUsers',['uses' => 'TestController@queryUsers']);

这俩路由我就不演示了, 分别解释一下, match 里路由为指定的请求方式, 一种或多种,

any 则是匹配任意方式, 无论是通过 get 还是 post 方式请求, 都能得到我们想要的结果.

我们再看看上面我设计的goods表

使用Laravel中的查询构造器实现增删改查功能

我们能看到这两条数据不知道创建的用户是谁, 但是有uid值, 这时候我们希望一个接口既返回商品信息又能够让我知道创建者是谁, 此时就需要用到多表联查了, 我们新增一个路由:

Route::get('test/queryGoods',['uses' => 'TestController@queryGoods']);

然后 TestController 里新增一个 queryGoods 方法:

public function queryGoods() {
 $goods = DB::table('goods')
   ->leftJoin('user', 'goods.uid', '=', 'user.id')
   ->get();
 return json_encode($goods);
 }

如期望一样返回数据:

[{
 id: 1,
 uid: 1,
 name: "测试商品1",
 desc: null,
 img_urls: null,
 price: "99.00",
 old_price: "78.00",
 real_name: "陈云",
 nickname: "穷摇.",
 head_url: null,
 age: null,
 gender: null,
 level: null
 },
 {
 id: 2,
 uid: 2,
 name: "测试商品2",
 desc: null,
 img_urls: null,
 price: "290.00",
 old_price: "389.00",
 real_name: "欧阳欣欣",
 nickname: "小欣欣",
 head_url: null,
 age: null,
 gender: null,
 level: null
 }
]

但是用户信息所有字段全部被返回了, 有些时候我们为了安全, 只需要返回指定字段, 比如我们只需要返回 user 表中的 real_namehead_url 字段, 那么我们就需要做一下字段的约束:

public function queryGoods() {
 $goods = DB::table('goods')
   ->leftJoin('user', 'goods.uid', '=', 'user.id')
   ->select('goods.*', 'user.real_name', 'user.head_url')
   ->get();
 return json_encode($goods);
 }

关注下这行代码:

select('goods.*', 'user.real_name', 'user.head_url')

这行代码表示返回goods表中的 所有字段 以及user表中的 real_namehead_url 字段, 就完美达到了我们想要的结果.

新增

至此查询已经基本写的差不多了, 我们开始向数据表里 新增 数据

我们新增一个 post 请求的路由 test/addUser :

Route::post('test/addUser',['uses' => 'TestController@addUser']);

添加 CSRF 路由白名单

protected $except = [
 'http://test.lara.com/test/queryUsers',
 'http://test.lara.com/test/addUser',
 ];

然后 TestController 里新增一个 addUser 方法:

public function addUser() {
 $real_name = request()->real_name;
 $nickname = request()->nickname;

 DB::table('user')->insert(
  ['real_name' => $real_name, 'nickname' => $nickname]
 );

 $users = DB::table('user')->get();
 return json_encode($users);
 }

打开 postman , 添加参数:

{"real_name":"刘亦菲","nickname":"小菲菲"}

点击send, 发现数据如期望一样正确插入.

使用Laravel中的查询构造器实现增删改查功能

查询构造器提供 insert 方法用于插入记录到数据库中。 insert 方法接收数组形式的字段名和字段值进行插入操作

DB::table('user')->insert(
  ['real_name' => $real_name, 'nickname' => $nickname]
 );

编辑

我们新增一个 put 请求的路由 test/updateUser :

同样添加 CSRF

Route::put('test/updateUser',['uses' => 'TestController@updateUser']);

路由白名单

protected $except = [
 'http://test.lara.com/test/queryUsers',
 'http://test.lara.com/test/addUser',
 'http://test.lara.com/test/updateUser',
 ];

然后 TestController 里新增一个 updateUser 方法:

public function updateUser() {
 $id = request()->id;
 $nickname = request()->nickname;
 
 DB::table('user')
  ->where('id', $id)
  ->update(['nickname' => $nickname]);

 $users = DB::table('user')->get();
 return json_encode($users);
 }

打开 postman , 我们知道刚刚新增的记录返回的 刘亦菲 的id是4, 我们根据 id 来更新下它的 nickname , postman 里添加请求参数:

{"id":"4", "nickname": "小阿菲~"}

点击send, 发现数据如期望一样正确更新.

使用Laravel中的查询构造器实现增删改查功能

查询构造器提供 update 方法用于更新已有的记录。 接受包含要更新的字段及值的数组

->where('id', $id)->->update(['nickname' => $nickname]);

删除

我们新增一个 delete 请求的路由 test/deleteUser :

Route::delete('test/deleteUser',['uses' => 'TestController@deleteUser']);

同样添加 CSRF 路由白名单

protected $except = [
 'http://test.lara.com/test/queryUsers',
 'http://test.lara.com/test/addUser',
 'http://test.lara.com/test/updateUser',
 'http://test.lara.com/test/deleteUser',
 ];

然后 TestController 里新增一个 deleteUser 方法:

public function deleteUser() {
 $id = request()->id;

 DB::table('user')
  ->where('id', $id)
  ->delete();

 $users = DB::table('user')->get();
 return json_encode($users);
 }

打开 postman , 我们现在想把 刘亦菲 的记录在数据库里删掉, 我们知道她的 id 是 4, 我们根据 id 来删除它, 添加请求参数:

{"id":"4"}

点击send, 发现数据如期望一样正确删除 (已经没有id为4的记录).

使用Laravel中的查询构造器实现增删改查功能

laravel中查询构造器可以使用 delete 方法从表中删除记录。添加 where 子句来约束 delete 的条件:

->where('id', $id)->delete();

文章有很多方法没有介绍到, 建议需要学习的同学看下文档, 传送门:

https://learnku.com/docs/lara...

总结

以上所述是小编给大家介绍的使用Laravel中的查询构造器实现增删改查功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
php 表单验证实现代码
Mar 10 PHP
php判断输入不超过mysql的varchar字段的长度范围
Jun 24 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
typecho插件编写教程(六):调用接口
May 28 PHP
PHP可变变量学习小结
Nov 29 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
Jul 28 PHP
php封装的page分页类完整实例
Oct 18 PHP
PHP的JSON封装、转变及输出操作示例
Sep 27 PHP
PHP sdk实现在线打包代码示例
Dec 09 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 #PHP
Yii框架通过请求组件处理get,post请求的方法分析
Sep 03 #PHP
laravel 配置路由 api和web定义的路由的区别详解
Sep 03 #PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 #PHP
解决Laravel blade模板转义html标签的问题
Sep 03 #PHP
Thinkphp5框架简单实现钩子(Hook)行为的方法示例
Sep 03 #PHP
php中钩子(hook)的原理与简单应用demo示例
Sep 03 #PHP
You might like
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
php实现插入排序
2015/03/29 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
php代码调试利器firephp安装与使用方法分析
2018/08/21 PHP
input 输入框内的输入事件详细分析
2010/03/17 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
nodejs中模块定义实例详解
2017/03/18 NodeJs
JS严格模式知识点总结
2018/02/27 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
javascript+Canvas实现画板功能
2020/06/23 Javascript
JS判断数组四种实现方法详解
2020/06/29 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
进一步探究Python中的正则表达式
2015/04/28 Python
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python如何通过protobuf实现rpc
2016/03/06 Python
python绘制热力图heatmap
2020/03/23 Python
Django ORM 自定义 char 类型字段解析
2019/08/09 Python
python3 实现调用串口功能
2019/12/26 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
泰国在线书店:SE-ED
2020/06/21 全球购物
教师求职推荐信范文
2013/11/20 职场文书
文明礼仪小标兵事迹
2014/01/12 职场文书
最常使用的求职信
2014/05/25 职场文书
英文导游词
2015/02/13 职场文书
企业宣传稿范文
2015/07/23 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
创业计划书之酒吧
2019/12/02 职场文书
将Python代码打包成.exe可执行文件的完整步骤
2021/05/12 Python
openEuler 搭建java开发环境的详细过程
2022/06/10 Servers