多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
#### 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-3.路由、模型与数据库操作 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-1.工具和本地环境 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-2.启动项目 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-3.路由、模型与数据库操作 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-4.跨域且传输数据,并优化后端接口 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-5.用户登录(一),密码的bcrypt(hash)加密与验证 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-6.用户登录(二),token验证 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-7.分类的模型关联和通用CRUD接口 > 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-8.使用mavoneditor(vue的markdown编辑器),并批量上传图片 ###### 1.URL访问 在多应用模式下,URL的访问地址定义如下: ~~~ http://serverName/index.php/应用/控制器/操作/参数/值... ~~~ 在上篇文章我们使用url重写方法,将index.php隐藏,所以URL访问地址为: ~~~ http://serverName/应用/控制器/操作/参数/值... ~~~ 根据上篇文章创建的admin端为例: ![](https://img.kancloud.cn/95/6c/956cfbc40bb9f8066f4eab21a356be88_742x486.png) 此时查看路由设置: ![](https://img.kancloud.cn/c3/69/c369d636c1a28b935919bef09da9d9f9_753x1007.png) thinkphp框架给控制器和操作设置了默认值,这也是我们不输入控制器名和操作名就可以访问页面的原因: ![](https://img.kancloud.cn/e9/e6/e9e69c9ddc829e718bbed50b0b3d73c9_356x149.png) 最官方的访问方法应该是: ~~~ localhost:3000/admin/index/index ~~~ 可能是自动查找index操作的原因,输入此段url会报错: ![](https://img.kancloud.cn/cb/44/cb44eb51813fab97260658f3bd9e54b1_616x222.png) 所以,输入到控制器就结束,控制器会自动查找默认操作名index: ![](https://img.kancloud.cn/2a/75/2a75523f0ea9f811b594798185a405b5_377x123.png) 如果我们想访问其他操作,可以定义操作名和操作方法: ![](https://img.kancloud.cn/8a/8e/8a8e01d966951ebf826fcbf681ca97fc_637x380.png) 此时,URL访问不输入操作名就会跳转到默认操作index,需要访问hello操作就要带上hello操作名: ![](https://img.kancloud.cn/1f/71/1f7163ef3c03ef058ba0ca93d9792716_409x126.png) ###### 2.路由与强制路由 (1)多应用模式下的路由定义: 以admin应用为例,创建route文件夹,内部新建文件app.php。 ![](https://img.kancloud.cn/0d/af/0daf337f4b8e040e692a93dd5667c077_189x255.png) 编写admin应用路由: a.只要是php文件,必须有`<?php ?>`引用文本,后半段`?>`可不写。 b.thinkphp框架需要对每一个功能模块进行命名空间定义,这样才能通过命名空间使用控制器访问该模块下的方法。 c.使用路由模块需要通过命名空间引入路由模块的方法。 ![](https://img.kancloud.cn/a3/5f/a35f3be1969ab16880789e08d66b4d10_422x143.png) 此时,使用路由方法定义路由: ~~~ // 自定义访问地址 // 控制器/操作 Route::get('/', 'index/index'); ~~~ ![](https://img.kancloud.cn/78/61/78619a5f2c5a7da840c4a778ccef2e4f_346x179.png) 此时,访问admin应用,自动跳转到该方法: ![](https://img.kancloud.cn/73/99/7399ba0c7d56ca3f4754ad6cf7159731_390x133.png) 再定义hello方法: ![](https://img.kancloud.cn/bf/ab/bfab94a6759b7d7af4fb3e34c402a2dc_474x188.png) ![](https://img.kancloud.cn/fc/98/fc9859d13f8f5414e006db4416234014_384x121.png) (2)全局路由定义 thinkphp的一切功能的运行顺序都是从内到外: ![](https://img.kancloud.cn/25/1e/251e633c11c6f8943a8fbd0b1c26c3fb_343x888.png) 在admin应用中定义的路由,url访问需要加admin: localhost:3000/admin 而如果我们想要访问域名的同时直接跳转到web应用,就可以使用全局路由: ![](https://img.kancloud.cn/5a/0f/5a0f631460202007b8d338504fd1b9ba_621x486.png) 此时直接访问域名,失败: ![](https://img.kancloud.cn/69/14/691498ab192983c9a7d276b631e21ebb_597x190.png) 在网上查询原因,开启多应用模式下,全局路由应该只可以返回数据,而不能解决url定向问题,解决方法应该在全局设置config/app.php修改默认应用名: ![](https://img.kancloud.cn/ed/a7/eda7f1aa7a1c236ccd8cc2ab0f2d5645_1459x1073.png) 测试: ![](https://img.kancloud.cn/f8/03/f8038456b5d92a6847f61466a0d7c197_373x134.png) (3)强制路由 我比较喜欢使用thinkphp的强制路由方法。此方法可以提高网站的安全性。 修改路由配置: ![](https://img.kancloud.cn/25/98/259871095d2617c3701713422c62ad90_1459x1073.png) 此时,刷新页面,找不到该页面了: ![](https://img.kancloud.cn/52/5f/525f67b7e0cd38d184bf1768c195a302_661x216.png) 强制路由的作用是,网站只能访问我们已经定义好的路由,没有定义的路由地址网站无法访问。 所以要想访问该地址,就必须在路由中写入该地址: ![](https://img.kancloud.cn/05/1b/051ba00acfa52ef7a89010994ef6fbea_731x393.png) 再次刷新页面就可以访问了: ![](https://img.kancloud.cn/a1/8b/a18b616ab81058f6fe1ed756dd99827e_294x121.png) 同时,在admin应用为例,我们此时只可以通过localhost:3000/admin访问应用,如果携带控制器名和操作名同样无法进行访问: ![](https://img.kancloud.cn/2a/bb/2abb0b9f869383892110760f3073e4f3_368x219.png) ![](https://img.kancloud.cn/35/0c/350c9964c75d326e79204e934d586f2b_620x229.png) 也就是说,强制路由状态下,我们将其设置为如何显示,就只能通过这种方法进行显示。 ###### 3.模型 掌握路由之后,就可以通过路由进行数据接口的设置,但在此之前,我们需要学习数据模型。 每个数据模型代表一个数据表,通过数据模型上传数据到数据库的表中。 (1)创建模型 我们以admin为例,创建一个管理员模型Admin.php文件。 ![](https://img.kancloud.cn/96/57/96579d8c2d248070d23c62ac79844b6e_685x427.png) 模型名会对应数据库中的数据表名,采用首字母大写的驼峰命名法。如果模型名为AdminModel,则对应的数据表名就应该为admin\_model。 此时我们定义的模型名为Admin,那么数据库中的数据表就应该为admin。 (2)连接数据库并新建数据表 打开navicat,新建一个数据库。 ![](https://img.kancloud.cn/17/c2/17c295f87ad3cd3d9c5904c2bbee2002_486x549.png) 连接测试: ![](https://img.kancloud.cn/ff/4e/ff4ea552cd3862d269253252f1c3a2ae_486x549.png) 在连接中右键新建数据库: ![](https://img.kancloud.cn/61/ff/61ffa3e82c2c7f2ac5368fc18097c124_456x399.png) 确定,双击mine-php数据库,新建表,根据模型名,定义表名为admin。 ![](https://img.kancloud.cn/d1/1c/d11cfaecb8d2d1e2d9b29b4ba9eb8a2c_761x528.png) ctrl+s保存输入表名admin,确定: ![](https://img.kancloud.cn/09/b8/09b819280ba731edd68f330d078e3b6c_980x669.png) ![](https://img.kancloud.cn/c9/e8/c9e85a6f6404d20fb126fd02c5ce855b_537x238.png) 回到Admin.php模型,设置字段内容: ~~~ <?php namespace app\admin\model; use think\Model; class Admin extends Model{ // 设置字段信息 protected $schema = [ 'id' => 'int', 'username' => 'string', 'password' => 'string', ];} ~~~ ![](https://img.kancloud.cn/81/9c/819c9c1430bd183c088ca50ba85e5605_533x330.png) ###### 4.数据库操作模型 (1)新增数据 在admin应用中编写新增数据方法add(): ~~~ public function add() { $admin = new Admin; $admin->save([ 'username' => 'admin', 'password' => '123456' ]); return '新增数据成功'; } ~~~ ![](https://img.kancloud.cn/f9/21/f9219c7007c8558fcfff8b1957b12755_701x589.png) 定义新增数据路由: ![](https://img.kancloud.cn/3f/38/3f380b5fd53f8253232df825fb511f56_443x218.png) 页面输入接口连接测试: ![](https://img.kancloud.cn/d3/90/d39050167cee0515b623478da493ccb3_406x120.png) 刷新查看数据库表: ![](https://img.kancloud.cn/60/6f/606f1df1ada431d2a31b07c75239b9d3_459x112.png) 插入成功。 为之后操作测试做铺垫,再插入两条数据: ![](https://img.kancloud.cn/57/13/571366c12cf945e0178693444d821fb8_304x193.png) (2)查找数据 * 查找全部数据 ~~~ public function find_all() { $admins = Admin::select(); dump($admins->toArray()); } ~~~ ![](https://img.kancloud.cn/c3/41/c34190d754e3674c88b24e837a294afa_594x600.png) 添加路由: ![](https://img.kancloud.cn/f6/19/f619c6cfc34628a9efa234261a1c1cf5_542x230.png) 网页测试: ![](https://img.kancloud.cn/f0/c4/f0c4bb89e57fe55a315746ff5e472f32_470x407.png) 也可以通过查询构造器方法进行查询: ~~~ public function findAll() { $admins = Admin::select(); dump($admins->toArray()); dump('______分界线______'); $list = Admin::where('password', '123456')->limit(2)->order('id', 'asc')->select(); foreach($list as $key=>$admin){ echo $admin->name; } } ~~~ ![](https://img.kancloud.cn/a6/28/a628e714578807106d17e427fe0334b5_1370x623.png) 网页测试: ![](https://img.kancloud.cn/fb/14/fb1404258ff3cca573d9dea8859c70f2_415x552.png) * 查找单条数据 ~~~ public function find() { $admins = Admin::find(2); dump($admins->toArray()); } ~~~ ![](https://img.kancloud.cn/60/20/60201ef89553ebd180172055223bdfe3_517x765.png) 添加路由: ![](https://img.kancloud.cn/d2/fa/d2fafc830d9b31b7e0f884af86362e6e_497x267.png) 网页测试: ![](https://img.kancloud.cn/d2/8b/d28b6e55dd39365b4f627bd38bc897d8_374x184.png) 也可以通过使用查询构造器查询满足条件的数据: ~~~ public function find() { $admins = Admin::where('username', '八方设计')->find(); dump($admins->toArray()); } ~~~ ![](https://img.kancloud.cn/05/ba/05bac5b464b118e4c10cbc50376f1eec_459x166.png) (3)更新数据 更新数据的过程就是先查找再更新。 也就是上面两种方法的合并: ~~~ public function update() { // 查找单条数据 $admin = Admin::where('username', '最强的森')->find(); // 定义修改值并保存 $admin -> password = "666666"; $admin -> save(); } ~~~ 添加路由: ![](https://img.kancloud.cn/ea/c9/eac9fb18286d5bbbb16b355050663f40_488x271.png) 网页测试,本次没有return返回结果,但没有报错就是成功了: ![](https://img.kancloud.cn/b3/50/b350cf79b1ed7208ab3ef4611bda4023_415x142.png) 刷新navicat查看: ![](https://img.kancloud.cn/95/03/950323c35634df837c5ab36b8ef494f1_427x189.png) 以上方法算是查询构造器方法。 修改方法也可以使用静态方法直接查找字段进行更新: ~~~ // 静态方法直接更新 $admin = Admin::update(['password' => '111111'], ['username' => '八方设计']); return '修改数据成功'; ~~~ ![](https://img.kancloud.cn/f4/b7/f4b7052543b4609887943f649efff7c1_814x268.png) 可以进行批量更新数据,大家自行测试: ~~~ $admin= new User; $data= [ // 修改id为1的字段 ['id'=>1, 'name'=>'thinkphp', 'email'=>'thinkphp@qq.com'], // 修改id为2的字段 ['id'=>2, 'name'=>'onethink', 'email'=>'onethink@qq.com'] ]; $admin->saveAll($data); ~~~ (4)删除数据 删除方法也比较灵活: a.先查找再删除: ~~~ $admin = Admin::find(1); $admin->delete(); ~~~ b.根据主键删除: ~~~ Admin::destroy(1); // 支持批量删除多个数据 Admin::destroy([1,2,3]); ~~~ c.条件删除: ~~~ Admin::destroy(function($query){ $query->where('id','>',10); }); // 或 Admin::where('id','>',10)->delete(); ~~~ 我就不一个一个测试了,中和三类方法制作一个构造器查询在删除: ~~~ public function delete() { // 查找 $admin = Admin::where('username', 'admin')->find(); $admin->delete(); return '删除数据成功'; } ~~~ ![](https://img.kancloud.cn/88/f8/88f8b6bf4bda2e4ae947a1e95bad48db_424x137.png) navicat刷新查看: ![](https://img.kancloud.cn/26/22/26227cb51b1f0fef798928e161dd03f4_345x157.png) 到此路由、模型与数据库的操作到此学习完。