因为我们要把数据从数据库获取到的话,需要使用数据模型层Model来获取。模型层Model和Controller一样也是一个类文件。
如果要从数据库里面获取数据的话,第一步需要的是TP框架它关于数据库的这个配置文件给修改掉。
先找到Home->Conf->里面的config.php文件夹打开,在这里边加上关于TP框架数据库的配置,或者可以修改。如下图
再找到TP框架本身的关于数据库的设置
路径是thinkphp->Thinkphp->Conf->convention.php打开后搜索找到关与需要修改的数据库的配置拿出来复制粘贴到config.php文件里面。
其中上图中的启用字段缓存配置文件在开发阶段最好改成false。默认是true
如果开启了字段缓存,那么现在所建的数据表,所有的字段都会被缓存下来,如果后期再去修改了字段。例如添加或修改了一个字段后它都不会表现出来
而且往里添加数据的时候就会报错。开发过程中建议打成false,这样后期再去修改数据库的话也没有关系,它能够立马显示出来。
这样设置完成数据库的配置文件后就可以取访问数据库里面的数据了。
创建模型对象来访问数据库:
在TP框架里面创建访问数据库对象有两种方法分别是M方法和D方法
首先是M方法:
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。所以这里必须要继承总的配置文件Controller
{
public function index(){
$n = M("nation"); //创建模型对象 造的对象是Think下面的Model的父类对象。
var_dump($n);
}
}
用M方法造完父类对象后输出一下对象$n结果如下图
结果显示为对象是Think下的Model类文件的对象,也就是父类对象。 实验结果可知用M方法造出来的对象是父类的对象。
另一种方法是D方法:
如果在Home模块下的Model类文件里面创建了NationModel.class.php类文件的话如下图:
这个D方法,如果事先在Model类文件里面创建了模型也就是创建了NationModel.class.php了的话,就创建模型对象,也就是每一张表的模型对象。
如果事先不在Model模型文件夹里面创建模型的话,它就会和M方法一样,造的是父类对象出来。
这个D方法和new方法类似:
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。
{
public function index(){
$n = new \Home\Model\NationModel(); //D方法就跟new的方法一致 就是造一个子类对象出来的
var_dump($n);
}
}
输出一下用new方法造出来的对象结果如下图:
可以看出输出结果是造出来的是一个NationModel类对象,结果是用这个new方法造的对象和用D方法来造出来的对象一致
结论:
只要是在以后的使用中,如果提前创建了模型文件,就是用new 或者是D方法,因为你只要创建了
模型文件的话,你肯定是要在里面加特殊东西的,如果不加的话就不用创建模型文件,没有创建模型文件的话就直接使用M方法来创建父类对象就可以。
所以到时候该用D方法还是该用M方法来创建模型对象取决于事先有没有在Model模型层文件里面创建了模型。
造完对象后再进行查数据:
对象得到数据的方法:
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。
{
public function index(){
$n = M("nation");
$arr = $n->select(); //用select方法查到的数据库里面的数据是查表内所有的数据
}
}
查出来的结果显示的列名都是小写的。 但在往数据库里面添加数据的时候必须要和表里面的列名的大小写一致。
所以以后为了不混淆大小写,用TP框架做数据表的话,把表名和列名都设置成小写的就可以了。
所以这个select方法是读取所有数据的
当查询数据库里的一条数据时:
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。
{
public function index(){
$n = M("Nation");
$arr = $n->select("n008,n009"); //select方法括号里面是可以给参数的,不过必须要给主键值来查数据
var_dump($arr);
}
}
所以在select方法括号里面可以给相应的主键值参数来查数据,可以给一个那就查询出来一个数据,给多个就查出来多个数据
但是用select方法查询出来的结果是个二维的数组。
如果想查个一维数组出来就用find方法:
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。
{
public function index(){
$n = M("Nation");
$arr = $n->find("n008"); //使用find方法查到的是一条数据,而且查询到的是个一维的数组。find方法括号里面需要写参数。
var_dump($arr);
}
}
所以说这个find方法适合来读一条数据
查询表内一共有多少条数据用count方法:
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。
{
public function index(){
$n = M("Nation");
$arr = $n->count(); //返回该表的数据总数的方法
var_dump($arr);
}
}
在TP框架里面其他的聚合函数都可以直接调来用
<?php
namespace Home\Controller;
use Think\Controller;
class TestController extends Controller //如果不继承父类它就不是一个操作方法。
{
public function index(){
$n = M("Car");
$arr = $n->count(); //返回该表的数据总数
$arr = $n->max("price"); //返回该表price字段的最大的值
$arr = $n->min("price"); //返回该表price字段的最小的值
$arr = $n->avg("price"); //返回该表price字段的所有数据的平均值
var_dump($arr);
}
}
连贯操作:
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不继承父类它就不是一个操作方法。 { public function index(){ $n = M("Car"); //连贯操作 $arr = $n->where("price>60")->select(); //where方法是来加条件的 var_dump($arr); } }
$n->where("price>60")这个执行完之后就变成$n了,因为它执行完了后返回了符合该条件的对象,所以就可以继续调方法了。因为where仅仅是加了一个条件而已,
如果想要得到数据的话还得调得到数据的方法才行。这个连贯操作只是给它加一些特殊的条件。想要得到数据就要用调数据的方法select
切换数据表table方法:
- 切换操作的数据表;
- 对多表进行操作;
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不继承父类它就不是一个操作方法。 { public function index(){ $n = M("Car"); //连贯操作 //$arr = $n->where("price>60")->select(); //var_dump($arr); $arr = $n->table("Nation")->select(); var_dump($arr); } }
原先$n是造的Car的模型对象,又因为是用的M方法造的对象,是个父类对象。所以可以使用table方法来写个别的表的表名将$n转化成别的表的模型对象来使用,提高效率。
这个对模型对象的切换只是个动态切换,使用table方法之后该对象$n变成了其他表的对象来调方法使用的话只能使用一次。
以后下面再用$n来调数据的话,以后的$n还是原来的car表的数据模型对象,上面的table方法换了其他表来使用只能使用一次。
field方法
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不继承父类它就不是一个操作方法。 { public function index(){ $n = M("Car"); $arr = $n->field("code,name")->select(); //准确查找某些列的数据的方法用field(""); var_dump($arr); } }
order方法查数据以什么什么方式来排序
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不继承父类它就不是一个操作方法。 { public function index(){ $n = M("Car"); $arr = $n->order("price desc")->select(); //所查到的数据排序 var_dump($arr); } }
limit方法代表筛选条件
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不继承父类它就不是一个操作方法。 { public function index(){ $n = M("Car"); //$arr = $n->limit(3)->select(); //如果参数给一个则代表取前几条数据。 $arr = $n->limit(3,3)->select(); //如果括号内参数写两个参数则代表跳过几条数据取几条数据。相当于来做分页查询。 var_dump($arr); } }
其中上面的$arr = $n->limit(3,3)->select();limit方法中是跳过3条取3条数据,意思也就是分页查询第二页的数据,每页有三条数据。
还有一种方法是page()的方法。也是用来进行分页查询的
用法是$arr = $n->page(2,3)->select();如果使用page来取第二页的话,括号里面的参数就写(2,3),前面这个参数2就代表第二页,而上上面的limit方法括号里的两个参数
则代表跳过三条数据再查三条数据也就是每页都显示三条数据,查的是第二页的三条数据。两个方法的参数值表达的意思不同。
distinct方法来对所得数据去重:
<?php namespace Home\Controller; use Think\Controller; class TestController extends Controller //如果不继承父类它就不是一个操作方法。 { public function index(){ $n = M("Car"); //对象$n来调用field方法查询brand这一列数据,再调用distinct方法对数据进行去重,再调用select方法显示数据 $arr = $n->field("brand")->distinct("brand")->select(); var_dump($arr); } }