模型这一块,感觉学习的不是很清楚,单独水一贴thinkphp中模型的学习笔记。
0x01 模型类简介
数据库中每一张表对应一个模型,类名就是表名,类里面的成员变量就是列名,
把一张表对应为一个类,其中一条数据对应一个对象
如果我们对该表的模型没有特殊操作的话可以不用建立该模型,但C层和V层必须有
模型类简单代码:
<?php namespace Home\Model; use Think\Model; class UserModel extends Model { public $tablePrefix =''; public $tableName='user'; public $trueTableName='user'; public $dbName='snatch'; public function text() { print_r($this->db->query('select * from segment limit 1')); return "这是模型"; } } ?>
控制类调用模型实例:
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ echo "<meta charset='utf-8'>"; echo "hello world."; $user=D('user'); $arr=$user->where(array('uid'=>'2','password'=>'fcea920f7412b5da7be0cf42b8c93759'))->order(array('uid'=>'desc'))->limit(1)->group('uid')->select(); echo $user->getLastSql(); print_r($user->query('select * from segment limit 1')); trace('',$user->getLastSql(),'user'); trace('hahah',$user->text(),'user'); $u = D(); print_r($arr); echo "<h1>_____________________________</h1>"; print_r($u->query("select * from case_text limit 0")); $user->select(array('where'=>'uid>1','order'=>'password asc')); }
模型不得不提一下D 和 M 函数。
D函数和M函数是快速初始化模型的Think PHP内置方法。
D函数和M函数的区别是,M函数可以初始化一个没有定义模型类的模型,也就是说M函数在执行原生SQL的时候效率更高。
$user= D('user');
这句代码代表初始化Model下面的UserModel类。
D函数实例化的是 你当前项目的Lib/Model下面的模块
如果该模块不存在的话 直接返回实例化Model的对象(意义就与M()函数相同)
而M 只返回 实例化 Model的对象..它的$name参数 作为数据库的表名来处理对数据库的操作
下面来举例实例化模型类的三种方法
0x02 模型类的实例化
三种方法 new直接实例化,M函数和D函数,重点区别下M和D函数的区别和意义。
new实例
用new的方式:需要自己创建模型文件,需要哪个表的模型,就去建哪个表的Model:在Home/Model/中新建xxxModel.class.php
<?php namespace Home\Model; use Think\Model; class InfoModel extends Model { }
对应控制器类文件:
function ShowAll() { $info=new \Home\Model\InfoModel(); //必须是绝对路径 从初始命名空间开始 var_dump($info); }
D函数
不用建模型文件,实例化父类Model的对象
$info = D("Info"); //造的是父类Think\Model的对象 var_dump($info);
M函数
实例化父类Model
$info = M("Info");
可以直接调用父类Model里边的属性,获得数据库相关操作,但没有具体表的数据
这样就可以操作Info表数据
D函数和M函数支持原生SQL查询:
public function index(){ echo "<meta charset='utf-8'>"; echo "hello world."; $user=D('user'); $arr=$user->query('select count(*) from word_a'); trace('SQL',$user->getLastSql(),'user'); print_r($arr); } //生成SQL: select count(*) from word_a:SQL public function index(){ echo "<meta charset='utf-8'>"; echo "hello world."; $user=M(); $arr=$user->query('select count(*) from word_a'); trace('SQL',$user->getLastSql(),'user'); print_r($arr); } //生成SQL: select count(*) from word_a:SQL
查询多条数据:
// 根据主键获取多个数据 $list = User::all('1,2,3'); // 或者使用数组 $list = User::all([1,2,3]); foreach($list as $key=>$user){ echo $user->name; } // 使用数组查询 $list = User::all(['status'=>1]); // 使用闭包查询 $list = User::all(function($query){ $query->where('status', 1)->limit(3)->order('id', 'asc'); }); foreach($list as $key=>$user){ echo $user->name; }
数据表定义
在ThinkPHP的模型里面,有几个关于数据表名称的属性定义:
模型相关配置选项
字段定义
可以通过设置DB_FIELDS_CACHE 参数来关闭字段自动缓存,如果在开发的时候经常变动数据库的结构,而不希望进行数据表的字段缓存,可以在项目配置文件中增加如下配置:
// 关闭字段缓存
'DB_FIELDS_CACHE'=>false
注意:调试模式下面由于考虑到数据结构可能会经常变动,所以默认是关闭字段缓存的。
全局配置定义
常用的配置方式是在应用配置文件或者模块配置文件中添加下面的配置参数:
//数据库配置信息
'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => '127.0.0.1', // 服务器地址 'DB_NAME' => 'thinkphp', // 数据库名 'DB_USER' => 'root', // 用户名 'DB_PWD' => '123456', // 密码 'DB_PORT' => 3306, // 端口 'DB_PARAMS' => array(), // 数据库连接参数 'DB_PREFIX' => 'think_', // 数据库表前缀 'DB_CHARSET'=> 'utf8', // 字符集 'DB_DEBUG' => TRUE, // 数据库调试模式 开启后可以记录SQL日志