要学习ThinkPHP框架操作数据库的方法,得先知道如何创建模型?


假设现在我们已经创建了一个数据库,里面有一张图书表和类别表。

DROP TABLE IF EXISTS `book`;
CREATE TABLE `book` (
  `bookno` int(11) NOT NULL AUTO_INCREMENT,
  `crono` int(11) NOT NULL,
  `bname` varchar(20) NOT NULL,
  `author` varchar(20) DEFAULT NULL,
  `pdate` varchar(15) DEFAULT NULL,
  `publisher` varchar(20) DEFAULT NULL,
  `remark` varchar(40) DEFAULT NULL,
  `price` decimal(4,2) DEFAULT NULL,
  PRIMARY KEY (`bookno`),
  KEY `aa` (`crono`),
  CONSTRAINT `aa` FOREIGN KEY (`crono`) REFERENCES `catagory` (`crono`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图书信息';


DROP TABLE IF EXISTS `catagory`;
CREATE TABLE `catagory` (
  `crono` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(20) DEFAULT NULL COMMENT '类别名',
  `explain` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`crono`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='图书类别';


请读者使用navcat之类的工具将这两张表导入MYSQL数据库,数据库名称就用test。


插入基本数据:

INSERT INTO `test`.`book` (`bookno`, `crono`, `bname`, `author`, `pdate`, `publisher`, `remark`, `price`) VALUES ('1', '2', '十万个为什么', '韩启德(总主编)', '2013年10月(第六版)', '少年儿童出版社', '《十万个为什么》是少年儿童出版社在20世纪60年代初编辑出版的一套青少年科普读物', '99.99');
INSERT INTO `test`.`book` (`bookno`, `crono`, `bname`, `author`, `pdate`, `publisher`, `remark`, `price`) VALUES ('2', '1', '淘气包马小跳', '杨红樱', '2003年7月', '未知', '该小说主要讲述了马小跳等孩子的成长生活以及他们和家长、老师、同学的故事', '88.00');

INSERT INTO `test`.`catagory` (`crono`, `cname`, `xeplain`) VALUES ('1', '科技类', NULL);
INSERT INTO `test`.`catagory` (`crono`, `cname`, `xeplain`) VALUES ('2', '儿童类', NULL);


数据库和表都创建好了以后,我们要在TP框架中配置数据库的链接,自然也是要去修改配置文件了。


为了方便起见,我们直接去修改全局配置文件。

image.png

image.png

写好链接配置后,去创建一个模型。一个事物,比如图书,在数据库里面叫做表。在PHP里面就是一个模型(类)。

image.png

类的命名规则如图所示。

<?php
namespace Home\Model;
use Think\Model;

class BookModel extends Model {
    
}

模型里面啥也不要写。


接着,再去创建一个与图书相对应的控制器:BookController

image.png

在这个类里面,创建一个测试方法,getBookList。

<?php
namespace Home\Controller; //前面不要加Application

use Think\Controller;

class BookController extends Controller{
    
    public function getBookList(){

       $book =  D("Book");
       
       $list = $book->where("bookno = 1") ->select();
      
       dump($list); //查询所有数据
        
    }
    
}

大D方法可以用来获取模型对象,是的,就是这么简单粗暴。然后用模型对象内置的select方法和where方法,就可以实现一个查询。最后返回的数据是一个二维数组,也就是列表。


注意,这边用到了链式调用的手法。


页面显示:

array(1) {
  [0] => array(8) {
    ["bookno"] => string(1) "1"
    ["crono"] => string(1) "2"
    ["bname"] => string(18) "十万个为什么"
    ["author"] => string(24) "韩启德(总主编)"
    ["pdate"] => string(25) "2013年10月(第六版)"
    ["publisher"] => string(21) "少年儿童出版社"
    ["remark"] => string(112) "《十万个为什么》是少年儿童出版社在20世纪60年代初编辑出版的一套青少年科普读物"
    ["price"] => string(5) "99.99"
  }
}


那如果我现在只想获取书本的ID和书名,咋办?


简单,用field方法即可。

 $list = $book->field("bookno,bname")->where("bookno = 1") ->select();


结果:

array(1) {
  [0] => array(2) {
    ["bookno"] => string(1) "1"
    ["bname"] => string(18) "十万个为什么"
  }
}


注意:select方法必须要放在最后面,其他随意。


现在我们查询出所有,加一个价格字段:

 $list = $book->where("1 = 1")->field("bookno,bname,price") ->select();;

结果:

array(2) {
  [0] => array(3) {
    ["bookno"] => string(1) "1"
    ["bname"] => string(18) "十万个为什么"
    ["price"] => string(5) "99.99"
  }
  [1] => array(3) {
    ["bookno"] => string(1) "2"
    ["bname"] => string(18) "淘气包马小跳"
    ["price"] => string(5) "88.00"
  }
}

我希望根据价格升序排序,那就用order方法。

$list = $book->order("price asc")->where("1 = 1")->field("bookno,bname,price") ->select();

结果:

array(2) {
  [0] => array(3) {
    ["bookno"] => string(1) "2"
    ["bname"] => string(18) "淘气包马小跳"
    ["price"] => string(5) "88.00"
  }
  [1] => array(3) {
    ["bookno"] => string(1) "1"
    ["bname"] => string(18) "十万个为什么"
    ["price"] => string(5) "99.99"
  }
}


模型方法虽然好用,但是有些时候还真的就是没有直接了当写sql来的方便。那么,如果直接运行sql语句呢?


query方法可以帮到你。

$list = $book->query("select * from book where 1=1 and price >90 order by price desc");

嗯,那么假如现在价格大于90的这个条件是外部输入的,90是一个变量,为了防止sql注入,我们可以给query方法中加入第二个参数。

 $list = $book->query("select * from book where 1=1 and price >%d order by price desc",array(90));


强制转换变量类型,防止sql注入。

%d - double,包含正负号的十进制数(负数、0、正数)
%s - string,字符串
%f - float,浮点数


如果嫌麻烦,而且你还就是喜欢用sql的方式(其实我个人也比较喜欢这样写sql),那么可以压根就不考虑模型层,直接创建一个Model对象,不依赖于任何具体的Model。

 $m = new Model();  
 $list = $m->query("select * from book where 1=1 and price >%d order by price desc",array(90));
 dump($list); //查询所有数据