详解thinkphp模型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解thinkphp模型相关的知识,希望对你有一定的参考价值。

模型这一块,Think php讲解的比较复杂,并且内部做了各种数据库兼容,我认为,虽然它做了这么多的兼容,但是并不代表我们要使用那么多晦涩的用法,事实上,那些用法是降低效率的。

ORM:object relational mapping 对象关系映射,以中间件的形式存在。

CURD: create update read delete

ActiveRecord模式:领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。

领域模型模式和模型类关系密切,这里首先介绍模型类:

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model;
 4 class UserModel extends Model
 5 {
 6     public $tablePrefix =‘‘;
 7     public $tableName=‘user‘;
 8     public $trueTableName=‘user‘;
 9     public $dbName=‘snatch‘;
10      
11     public function text() {
12         print_r($this->db->query(‘select * from segment limit 1‘));
13         return "这是模型";
14     }
15 }
16 ?>

之前没有介绍过,相比于文档,控制器、模型最好的学习方法是原生Think PHP的对应控制器、模型基类。

对于上面的模型,初始化的方法很简单,下面是各种调用代码举例:

 1 <?php
 2 namespace Home\Controller;
 3 use Think\Controller;
 4 class IndexController extends Controller {
 5 /**
 6 * 首页显示
 7 */
 8 public function index(){
 9 echo "<meta charset=‘utf-8‘>";
10 echo "hello world.";
11 $user=D(‘user‘);
12 // $arr=$user->getField(‘uid‘);
13 $arr=$user->where(array(‘uid‘=>‘2‘,‘password‘=>‘fcea920f7412b5da7be0cf42b8c93759‘))->order(array(‘uid‘=>‘desc‘))->limit(1)->group(‘uid‘)->select();
14 echo $user->getLastSql();
15 print_r($user->query(‘select * from segment limit 1‘));
16 trace(‘‘,$user->getLastSql(),‘user‘);
17 trace(‘hahah‘,$user->text(),‘user‘);
18 $u = D();
19 // trace(‘think‘,,‘user‘);
20 print_r($arr);
21 echo "<h1>_____________________________</h1>";
22 print_r($u->query("select * from case_text limit 0"));
23 $user->select(array(‘where‘=>‘uid>1‘,‘order‘=>‘password asc‘));
24 // $u->where(array(‘case_id‘ => 2))->select();
25 // trace(‘‘,$u->text(),‘user‘);
26  
27 // $this->show(‘<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 24px 48px;"> <h1>:)</h1><p>欢迎使用 <b>ThinkPHP</b>!</p><br/>版本 V{$Think.version}</div><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_55e75dfae343f5a1"></thinkad><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script>‘,‘utf-8‘);
28 }

D函数和M函数:

D函数和M函数是快速初始化模型的Think PHP内置方法。

D函数和M函数的区别是,M函数可以初始化一个没有定义模型类的模型,也就是说M函数在执行原生SQL的时候效率更高。因为不需要架加载模型类,所以M函数不能够加载对应的模型中的函数方法。当然,并不是说D函数不能初始化空模型。

$user= D(‘user‘);这句代码代表初始化Model下面的UserModel类。

匪夷所思的查询条件:

Think PHP中复杂多变的函数把单一的SQL拆解的很难理解。

支持select()条件、group()条件、order()条件、limit条件、where()条件等常见的查询条件内嵌,应用举例:

 1 public function index(){
 2         echo "<meta charset=‘utf-8‘>";
 3         echo "hello world.";
 4         $user=D(‘user‘);
 5         $arr=$user->limit(1)->order(‘uid desc‘)->where(‘uid>1‘)->group(‘uid‘)->select();
 6         trace(‘SQL‘,$user->getLastSql(),‘user‘);
 7         print_r($arr);
 8     }
 9 //生成SQL:
10 SELECT * FROM snatch.user WHERE ( uid>1 ) GROUP BY uid ORDER BY uid desc LIMIT 1 :SQL

D函数和M函数支持原生SQL查询:

 1 public function index(){
 2         echo "<meta charset=‘utf-8‘>";
 3         echo "hello world.";
 4         $user=D(‘user‘);
 5         $arr=$user->query(‘select count(*) from word_a‘);
 6         trace(‘SQL‘,$user->getLastSql(),‘user‘);
 7         print_r($arr);
 8     }
 9 //生成SQL:
10 select count(*) from word_a:SQL
11  
12 public function index(){
13         echo "<meta charset=‘utf-8‘>";
14         echo "hello world.";
15         $user=M();
16         $arr=$user->query(‘select count(*) from word_a‘);
17         trace(‘SQL‘,$user->getLastSql(),‘user‘);
18         print_r($arr);
19     }
20 //生成SQL:
21 select count(*) from word_a:SQL 

请记住以上只是测试函数的使用,使用yuanshengSQL务必使用M函数。

 

and方法除了在各个条件中直接写and,还可以使用数组

 1 public function index(){
 2         echo "<meta charset=‘utf-8‘>";
 3         echo "hello world.";
 4         $user=D(‘user‘);
 5         $arr=$user->limit(1)->order(‘uid desc‘)->where(array(‘password‘=>‘123456‘,‘uid‘=>‘100‘))->group(‘uid‘)->select();
 6         trace(‘SQL‘,$user->getLastSql(),‘user‘);
 7         print_r($arr);
 8     }
 9 //生成SQL:
10 SELECT * FROM snatch.user WHERE `password` = ‘123456‘ AND `uid` = 100 GROUP BY uid ORDER BY uid desc LIMIT 1 :SQL

我实际测试中中,数组中只能使用确定等于的条件

 

调试方法:

技术分享

 1 public function index(){
 2         echo "<meta charset=‘utf-8‘>";
 3         echo "hello world.";
 4         $user=D(‘user‘);
 5         $arr=$user->limit(1)->order(‘uid desc‘)->where(array(‘password‘=>‘123456‘,‘uid‘=>‘100‘))->group(‘uid‘)->select();
 6         trace($user->getLastSql(),‘SQL‘,‘user‘);
 7         trace($user->getDbFields(),‘Fields‘,‘user‘);
 8         trace($user->getTableName(),‘TBN‘,‘user‘);
 9         trace($user->getPk(),‘主键‘,‘user‘);
10         print_r($arr);
11     }
12 //效果:
13 SQL:SELECT * FROM snatch.user WHERE `password` = ‘123456‘ AND `uid` = 100 GROUP BY uid ORDER BY uid desc LIMIT 1
14 Fields:Array ( [0] => uid [1] => username [2] => password [3] => email [4] => telephone )
15 TBN:snatch.user
16 主键:uid

缓存:

缓存包括缓存在文件中和缓存在内存中,由于缓存在文件中需要增加额外的IO,所以建议使用内存缓存(即把缓存定义在模型类中)。

你可以在内存中加载$pk 主键 $fields 字段数组。

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model;
 4 class UserModel extends Model
 5 {
 6     public $tablePrefix =‘‘;
 7     public $tableName=‘user‘;
 8     public $trueTableName=‘user‘;
 9     public $dbName=‘snatch‘;
10     protected $pk=‘ud‘;
11     protected  $fields=array(‘uid‘,‘username‘);  
12     public function text() {
13         print_r($this->db->query(‘select * from segment limit 1‘));
14         return "这是模型";
15     }
16 }
17 ?>
18  
19 <?php ^^^^^
20    public function index(){
21         echo "<meta charset=‘utf-8‘>";
22         echo "hello world.";
23         $user=D(‘user‘);
24         $arr=$user->limit(1)->order(‘uid desc‘)->where(array(‘uid‘=>‘4‘))->group(‘uid‘)->select();
25         trace($user->getLastSql(),‘SQL‘,‘user‘);
26         trace($user->getDbFields(),‘Fields‘,‘user‘);
27         trace($user->getTableName(),‘TBN‘,‘user‘);
28         trace($user->getPk(),‘主键‘,‘user‘);
29         print_r($arr);
30     }
31 ^^^
32 ?>
33  
34 //执行结果:
35 SQL:SELECT * FROM snatch.user WHERE `uid` = ‘4‘ GROUP BY uid ORDER BY uid desc LIMIT 1
36 Fields:Array ( [0] => uid [1] => username )
37 TBN:snatch.user
38 主键:ud

通过以上测试,你可以发现:

$pk和$field必须是protected,不信你可以试试private~

$pk和$field的字段可以不对应,但是这就失去了缓存的意义。

get函数实际上得到的是缓存信息。

缓存支持字段类型检查。

 

数据库连接配置:

 1 //数据库配置1
 2 ‘DB_CONFIG1‘ => array(
 3 ‘db_type‘ => ‘mysql‘,
 4 ‘db_user‘ => ‘root‘,
 5 ‘db_pwd‘ => ‘1234‘,
 6 ‘db_host‘ => ‘localhost‘,
 7 ‘db_port‘ => ‘3306‘,
 8 ‘db_name‘ => ‘snatch‘
 9 ),
10 //数据库配置2
11 ‘DB_CONFIG2‘ => ‘mysql://root:[email protected]:3306/snatch‘
12 //应用方法:
13 new \Home\Model\NewModel(‘new‘,‘think_‘,‘DB_CONFIG1‘);
14 new \Home\Model\BlogModel(‘blog‘,‘think_‘,‘DB_CONFIG2‘);
15 //全部可配置的属性:
16 ‘DB_TYPE‘ => ‘‘, // 数据库类型
17 ‘DB_HOST‘ => ‘‘, // 服务器地址
18 ‘DB_NAME‘ => ‘‘, // 数据库名
19 ‘DB_USER‘ => ‘‘, // 用户名
20 ‘DB_PWD‘ => ‘‘, // 密码
21 ‘DB_PORT‘ => ‘‘, // 端口
22 ‘DB_PREFIX‘ => ‘‘, // 数据库表前缀
23 ‘DB_DSN‘ => ‘‘, // 数据库连接DSN 用于PDO方式
24 ‘DB_CHARSET‘ => ‘utf8‘, // 数据库的编码 默认为utf8
25  
26 //连接数据库的配置信息的调用规则跟之前介绍配置文件的调用优先级策略是一致的,此处不做赘述。
27 //Think PHP 支持主流数据库的驱动(我们使用的MySQL和MongoDB均被支持)
28 //可以定义长连接:
29 ‘DB_PARAMS‘ => array(PDO::ATTR_PERSISTENT => true);
30  
31 //模型类动态定义的方法:数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集
32 protected $connection = ‘mysql://root:[email protected]:3306/thinkphp#utf8‘;
33  

模型内跨数据库查询:

1 public function text() {
2        return $this->db()->query(‘select * from segment limit 1‘);
3        return "这是模型";
4    }

 

db函数是可以带条件的,你可以在里面选择添加数据库调用信息,此处不做详细举例。

 

自动验证等。

以上是关于详解thinkphp模型的主要内容,如果未能解决你的问题,请参考以下文章

ThinkPHP函数详解:M方法

Thinkphp各种方法知识图谱

ThinkPHP函数详解:F方法

ThinkPHP函数详解:F方法

神经网络基础部件-优化算法详解

coreseek (sphinx)+ Mysql + Thinkphp搭建中文搜索引擎详解