使用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中理解print EOT分界符和echo EOT的用法区别小结
Feb 21 PHP
浅谈php中mysql与mysqli的区别分析
Jun 10 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
php数组合并array_merge()函数使用注意事项
Jun 19 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
Oct 20 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
php中引用符号(&amp;)的使用详细介绍
Dec 06 PHP
PHP实现权限管理功能示例
Sep 22 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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
ThinkPHP项目分组配置方法分析
2016/03/23 PHP
php好代码风格的阶段性总结
2016/06/25 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
javascript开发中因空格引发的错误
2010/11/08 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jquery跨域请求示例分享(jquery发送ajax请求)
2014/03/25 Javascript
一行命令搞定node.js 版本升级
2014/07/20 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
vue跨域解决方法
2017/10/15 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
python输出数学符号实例
2020/05/11 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
英国著名书店:Foyles
2018/12/01 全球购物
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
医院实习介绍信
2014/01/12 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
文明旅游倡议书
2015/04/28 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
Python Numpy库的超详细教程
2022/04/06 Python
MYSQL如何查看操作日志详解
2022/05/30 MySQL