目前学TP框架目的是让开发更高效,所以懂得使用流程,会调api就行。
2017/4/30
一、任务
- 动手写一个mvc实例,熟悉熟悉最简单的CRUD操作。
- 在不断优化的过程中,回顾TP5使用流程
二、正文
- 完成基本的CRUB操作
1、sql操作
<?php
namespace app\api\controller;
/**
* Description of StudentTest
* StudentTest用来通知model中的Student进行CRUB操作
* @author Administrator
*/
class StudentTest extends \think\Controller {
//函数名这样写,url怎么写?
//http://localhost/api/student_test/insert/name/123/id/123/age/123/sex/123
public function insert($name, $id, $age, $sex) {
$student = new \app\api\model\Student;
$student->number = $id;
$student->name = $name;
$student->age = $age;
$student->sex = $sex;
$student->save();
}
//函数名这样写,url应该写成什么样?
//http://localhost/api/studentTest/deleteStudent
//函数名完全小写,还未曾测试
public function deleteStudent() {
//有占位符吧?
//1.使用原生操作 测试结果:成功 返回结果:int(1)
$result = \think\Db::execute('delete from student where number = 123');
dump($result);
//
}
//函数名完全小写 实验结果:成功 返回结果:int(1)
//http://localhost/api/studentTest/createstudent
public function createStudent() {
//2.使用原生操作
$result = \think\Db::execute('insert into student(name,number,age,sex) values (?,?,?,?)', ['789', 789, '789', '789']);
dump($result);
}
/*
实验结果:array(1) {
[0] => array(4) {
["name"] => string(3) "789"
["number"] => int(789)
["age"] => int(789)
["sex"] => int(789)
}
}
*/
public function findStudent() {
$result = \think\Db::query('select * from student where number = ?', [789]);
dump($result);
//query方法返回的是一个数组
}
public function updateStudent(){
//在原生操作中使用数组的感觉很好。
$result = \think\Db::execute('update student set age = ? where number = ?',['999',789] );
dump($result);
}
}
以上我使用的是数据库原生查询(也就是Sql查询)。初次之外还有更高级的数据库链式查询,使用模型查询。这三种操作方式中,属模型查询最高级,原生查询最低级。
2、链式操作
//使用链式操作数据库
//sql查询和链式查询的相同点:都使用Db类操作数据库。
//sql查询和链式查询本质上是不是等价的?
//是的。tp5来发手册上写明,链式查询最后会生成相应的sql语句。
public function insertV2(){
//注意php数据语法
\think\Db::name('student')
->insert(['name'=>'zs','number' => 1110,'sex' => '12','age' =>'22']);
//数组的顺序没要求
}
public function updateV2(){
\think\Db::name('student')
->where('number',1110)
->update(['name'=>"ls"]);
}
/*
* array(1) {
[0] => array(4) {
["name"] => string(2) "ls"
["number"] => int(1110)
["age"] => int(22)
["sex"] => int(12)
}
}
*/
//多表联合查询怎么做?
public function findV2(){
$result =\think\Db::name('student')
->where('number',1110)
->select();
dump($result);
}
//http://localhost/api/student_test/deleteV2/number/1110
//实验结果:成功
public function deleteV2($number) {
\think\Db::name('student')
->where('number',$number)
->delete();
}
问1:如果查询涉及到多个表?怎么处理?
解决办法:既然可以使用sql语句一次查询多个表,在tp5,当然也可以。比如在《数据库系统概论》中指明“如果需要快捷查询多个表的数据,可以使用视图查询,相当于在数据库创建了一个视图,但仅仅支持查询操作”。
3、模型操作
//使用模型进行操作
public function add() {
//有没有()都行吧?
$student = new \app\api\model\Student();
$student->name='wangma';
$student->number=564;
$student->age=56;
$student->sex=55;
if($student->save()){
return '用户'.$student->name.'Suceess';
}else{
return $student->getError();
}//if ended 能不能把url再缩短一点? 配置下路由
//Route::rule("sadd",'api/StudentTest/add');
}
//模型查询
//模型的get方法用于获取数据表的数据并返回当前模型对象实例,通常只需要传入主键作为参数,如果没有传入任何值,则表示获取第一条数据。这点还未测试
public function read($number){
$student = \app\api\model\Student::get($number);
echo $student->name.'<br/>';
echo $student->number.'<br/>';
}
//模型更新
public function update($number) {
$student = \app\api\model\Student::get($number);
$student->name = 'fengyuan';
if(false !=$student->save()){
return '用户更新成功';
} else {
return $student->getError();
}
}
//模型删除
public function delete($number) {
$student = \app\api\model\Student::get($number);
if($student){
$student->delete();
return '删除成功';
} else {
return '删除失败';
}
}
问2:如果查询涉及到多个表?怎么处理?
答:模型关联。就我个人理解,模型关联本质上就是数据表的关联,是实现多表查询的手段。比如数据库中有student表,book表
Student模型:
<?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace app\api\model;
/**
* Description of Student
* 对应数据表 student
* @author Administrator
*/
class Student extends \think\Model {
protected $table = 'student';
//最重要的关联:理解了关联,也就能理解大部分实例了。
//模型关联(数据表关联)不是在控制器中关联
public function books() {
//return $this->hasMany('BooK');
//用户has one 书关联
return $this->hasOne('Book','number');
//tp手册上写 hasOne('关联模型名','关联外键','主键','别名定义,'jion类型')
//关联外键=当前模型的_id ,当前模型名是指Student还是hasOne中填入的模型
//如果是Student,z则出错
//数据表字段不存在:[number]
//所以手册所说的应该是是hasOne中的模型
//user_id 是book表的外键。
}
}
控制器部分代码:
//模型关联后的操作
//关联写入
public function addV3(){
$student = new \app\api\model\Student();
//写入关联数据
$student->name ='5555747127521475tttt';
$student->number='5252458879';
$student->age=6666;
$student->sex=66666;
if($student->save()){
$book = new \app\api\model\Book();
$book->name='learn php';
$book->no='125553';
$student->books()->save($book);
return '用户新增成功';
} else {
return $student->getError();
}
}
以上路由已经配置好。
三、小结:
至此,php语法,tp框架的流程算是熟悉了一遍,tp5的其他功能,比如事务,还没有试过,需要用时再翻手册查吧。
2017/5/1 明天继续更。。。