学习TP框架(二)

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

2017/4/30

一、任务

  1. 动手写一个mvc实例,熟悉熟悉最简单的CRUD操作。
  2. 在不断优化的过程中,回顾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 明天继续更。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值