【三十二】thinkphp之连接数据库、实例化模型

1.连接数据库

Thinlphp内置了抽象数据库访问层,把不同的数据操作封装起来。我们只需要调用公共的DB类进行操作即可。DB类会自动调用相应的数据库驱动来处理。

在应用目录/common/conf/config.php中设置

    // mysql全局配置定义    
    'DB_TYPE'=>'mysql', //数据库类型
    'DB_HOST'=>'localhost', //服务器地址
    'DB_NAME'=>'test', //数据库名
    'DB_USER'=>'root', //用户名
    'DB_PWD'=>'', //密码
    'DB_PORT'=>3306, //端口
    'DB_PREFIX'=>'', //数据库表前缀
    // PDO专用配置
    // ps:3.2.3数据库类和驱动采用PDO重写了,因此无论是什么数据库都是基于PDO实现的,所以DB_TYPE不再支持PDO设置
    // 3.21 DB_TYPE填写pdo
    // 3.23填写准确的类型mysql
    'DB_TYPE'=>'mysql', //数据库类型
    'DB_USER'=>'root', //用户名
    'DB_PWD'=>'', //密码
    'DB_PREFIX'=>'', //数据库表前缀
    'DB_DSN'=>'mysql:host=localhost;dbname=test;charset=UTF8',

应用目录/Home/Controller/ModelController.class.php

<?php
namespace Home\Controller;
use Think\Controller;
// 要引用Model模块
use Think\Model;
class ModelController extends Controller {
    public function test($user,$pass){
       echo "user:".$user."<br/>pass:".$pass;
    }
    public function model1(){
        // 实例化一个Model对象
        $user=new Model('user1');
        var_dump($user->select());
    }
}

2.实例化模型

1.使用Model基类

<?php
namespace Home\Controller;
use Think\Controller;
// 要引用Model模块
use Think\Model;
class ModelController extends Controller {
    public function model1(){
        // Model 基类可以传递三个参数:
        // Model(['模型名'],['数据表前缀'],['数据库连接信息']);
        // 实例化一个Model对象,传一个数据表名
        // ********方法一***********
        $user=new Model('elector','','mysql://root:@localhost/test');
        //显示变量结构
        var_dump($user);
         // ********方法二***********
        $user=new Model('user1');
        // 打印出所有数据
        var_dump($user->select());
    }
}

2.使用M()方法

 $Demo = new Model();那么它等价于 $Demo = M();

  // 使用M方法不需要引入命名空间 (use Think\Model;)
       $user=M('elector');
        var_dump($user->select());

3.模型定义

  1. Model类的名字要与Controller类的名字一致
  2. 在model类中这个类的名字代表要查询的表名字
  3. 在controller类中要引用model类
  4. 全部设置好了,就可以在浏览器访问了

在Home目录/Model下创建一个model类.(User1Model.class.php)

<?php
namespace Home\Model;
use Think\Model;
// 注意:这个User1Model的意思是要查询的是表名为user1
class User1Model extends Model
{
}

在Home目录/Controller下创建一个Controller类(User1Controller.class.php)

<?php
namespace Home\Controller;
use Think\Controller;
// 注意:要引用model类
use Home\Model\User1Model;
class User1Controller extends Controller {
    public function model1(){
        $user=new User1Model();
        var_dump($user->select());
    }
}

在common/conf/config.php

//页面Trace,调试辅助工具
'SHOWPAGETRACE' =>true,

对表名、前缀、附加数据库修改。代码如下:

 model/User1Model.class.php

<?php
namespace Home\Model;
use Think\Model;
// 注意:这个User1Model的意思是要查询的是表名为user1
class User1Model extends Model
{
    // 1.我们查询语句为:SELECT * FROM `test.user1`
    // 重新定义表前缀
    protected $tablePrefix = 'abc_';
    // 重新定义表名
    protected $tableName = 'abc';
    // 重新定义完整的带前缀的表名
    protected $trueTableName = 'user1';
    // 修改附加数据库名
    protected $dbName = 'tp';
}

 4.使用D()方法

ThinkPHP 提供了 D()方法来直接是实例化模型类,并且还可以免去引入命名空间等操作

  model/User1Model.class.php

<?php
namespace Home\Controller;
use Think\Controller;
// 注意:要引用model类
use Home\Model\User1Model;
class User1Controller extends Controller {
    public function model1(){
        //实例化UserModel类
        $user=D('user1');
        var_dump($user->select());
    }
}

PS:使用 D()方法比直接使用模型类更加的智能.

如果在\Home\Model\UserModel 找不到该模型类,那么就会去公共模块下找\Common\Model\UserModel 去找。

如果还找不到,就会直接实例化基类 Model()类,也就是等同于使用 M()方法

区别:

  1. D就是实例化一个基于Model文件的Model
  2. M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在

5.使用原生的 SQL 语句进行操作数据库

        $user1=M();
        var_dump($user1->query('select * from user1 where id=1'));
posted @ 2018-01-19 13:55  花花妹子。  阅读(1727)  评论(0编辑  收藏  举报