学习TP框架(二)

来源:互联网 发布:吃奶酪 知乎 编辑:程序博客网 时间:2024/06/15 19:03

目前学TP框架目的是让开发更高效,所以懂得使用流程,会调api就行。

2017/4/30

一、任务

  1. 动手写一个mvc实例,熟悉熟悉最简单的CRUD操作。
  2. 在不断优化的过程中,回顾TP5使用流程

二、正文

  • 完成基本的CRUB操作

1、sql操作

<?phpnamespace 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 明天继续更。。。

0 0
原创粉丝点击