• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

ThinkPHP模型详解

php 搞代码 4年前 (2022-01-01) 43次浏览 已收录 0个评论

这篇文章主要介绍了ThinkPHP模型详解的相关资料,需要的朋友可以参考下

模型定义,默认情况下,ThinkPHP的模型类是位于/Home/Model/目录之下,模型类通常需要继承系统的\Think\Model类或其子类,下面是一个Home\Model\UserModel类的定义:

文件命名遵守UserModel.class.php的方式,跟控制器的命名一样

 <?php namespace Home\Model; use Think\Model; class UserModel extends Model { } 

模型类的作用大多数情况是操作数据表的,如果按照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表,但你可以根据自己的需求来定制自己的数据表设置和操作。

首先我们需要在配置文件设置我们的数据库连接信息:

 'DB_TYPE'        => 'mysql', 'DB_HOST'        => 'localhost', 'DB_NAME'        => 'database', 'DB_USER'        => 'username', 'DB_PWD'        => 'password', 'DB_PORT'        => '3306', 

这些配置信息还是在/Home/Conf/config.php文件里设置。

指定数据表前缀

指定标前缀,我们在第一课的配置项已经指定,以下的文字表示你可以灵活配置你的数据表。

 protected $tablePrefix = 'top_'; 

如果数据库的表没有表前缀,使用空字符串代替

 protected $tablePrefix = ''; 

指定数据表,此处的指定的数据表的不需要添加表前来源gaodai$ma#com搞$代*码网缀:

 protected $tableName = 'user'; 

举个例子说,比如说你的数据库中有一个没有表前缀的,名为users的数据表,可以用以下的两种方法在模型中进行下面的定义:

第一,直接根据系统的规范来命名模型类来命名模型,比如说就命名为UsersModel那么只需要在这个类里面加上下面的设置就可以了:

 protected $tablePrefix = ''; 

ThinkPHP系统就会自动定位到users表了。

第二种情况时,如果你的模型类没有按照系统规范来命名,比如说不小心命名为UserModel,这种情况下可以同时指定表前缀和表明,比如:

 protected $tablePrefix = ''; protected $tableName = 'users'; 

或者你直接指定trueTableName:

protected $trueTableName = ‘users’;

既然模型通常是用来操作数据表,那么我们来看看模型的基本CURD:

注:为了方便演示,我们在UserController中定义一个testDemo()方法用于演示

 public function testDemo() { } 

以下的代码将会一段一段在这个方法里演示,你可以通过访问http://localhost:8999/index.php/Home/User/testDemo来看到实际效果。

添加纪录

 $user = M('User'); $data['username'] = 'ThinkPHP'; $data['email'] = '[email protected]'; $user->create($data); $record = $user->add(); dump($record); 

add()返回的是插入数据的id,对于不存在的表字段,add()方法会自动过滤。

读取纪录

在ThinkPHP中读取数据的方式很多,通常分为读取数据、读取数据集和读取字段值

 $user = M('User'); $record = $user->where('username="ThinkPHP"')->find(); dump($record); 

读取字段值

 $user = M('User'); $record = $user->where('id=3')->getField('username'); dump($record); 

默认情况下,当只有一个字段的时候,返回满足条件的数据表中的该字段的第一行的值.如果getField()传入多个字段,返回值将是一个关联数组:

 $user = M('User'); $record = $user->getField('username,email'); dump($record);<br />

这个数组总是以传入的第一个第一个字段为键值的。如果修改为:

 $user = M('User'); $record = $user->getField('email,username'); dump($record); 

将上面的两次代码分别放到testDemo(),你就会看到不一样的结果集。

用save()方法更新数据

 $user = M('User'); $data['username'] = 'ThinkPHPSave'; $data['email'] = '[email protected]'; $record = $user->where('id=3')->save($data); dump($record); 

这里的$record返回的事1,表示成功更改。

当然,你也可以这样:

 $user = M('User'); $user->username = 'ThinkPHP'; $user->email = '[email protected]'; $record = $user->where('id=3')->save(); dump($record); 

日常开发的时候经常会遇到一些只更新某些字段的情况,可以通过下面的方式来实现:

 $user = M("User"); $record = $user->where('id=4')->setField('username','ThinkPHPChangeName'); dump($record); 

同时更新多个字段,可以将数据以数组的形式传给setField()方法:

 $user = M('User'); $data = array('username'=>'ThinkPHPChangeArray','email'=>'[email protected]'); $record = $user-> where('id=6')->setField($data); dump($record); 

ThinkPHP删除数据使用delete方法,例如:

 $user = M('User'); $record = $user->where('id=3')->delete(); dump($record); 

或者你可以直接使用:

 $record = $user->delete('1,2,5'); dump($record); 

这样就达到了删除主键1,2,5这三条纪录了。

ActiveRecords

ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录映射到对象。以下实例将使用ActiveRecords重现对数据表的CURD,看看ActiveRecords给我们带来了什么好处。

 $user = M("User"); $user->username = 'ThinkPHPWithActive'; $user->email = '[email protected]'; $record = $user->add(); dump($record); 

读取纪录

AR最大的特点可能就是它的查询模式了,模式简单易用,因为更多angular-js的相关知识,对于模板,我们后续会讲到,但不管怎样,现在我们访问
http://localhost:8999/Home/User/register,就可以看到我们的注册表单页面了。

注意到form表单中,action=”__URL__/registerValidate”,这表示提交到当前的控制器的registerValidate()方法处理,所以我们在UserController中增加registerValidate()方法:

 public function registerValidate() { $data['username'] = $_POST['username']; $data['email'] = $_POST['email']; $user = D("User"); if ( !$user->create($data) ) { exit($user->getError()); } //todo: validation passes, add data to database and redirect somewhere echo 'validation passes'; } 

这里的if ( !$user->create($data) )会触发自动验证并判断验证是否通过验证。你可以尝试在表单里填写不同的数据来进行测试,也可以修改一下验证规则,更多规则可以到官网查看:

http://document.thinkphp.cn/manual_3_2.html#auto_validate

关联模型

通常我们所说的关联关系包括下面三种:

一对一关联 :ONE_TO_ONE,包括HAS_ONE 和 BELONGS_TO
一对多关联 :ONE_TO_MANY,包括HAS_MANY 和 BELONGS_TO
多对多关联 :MANY_TO_MANY

关联定义

ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包括下面四种:
HAS_ONE、BELONGS_TO、HAS_MANY和MANY_TO_MANY。
一个模型根据业务模型的复杂程度可以同时定义多个关联,不受限制,所有的关联定义都统一在模型类的 $_link 成员变量里面定义,并且可以支持动态定义。要支持关联操作,模型类必须继承Think\Model\RelationModel类,关联定义的格式类似于:

 namespace Home\Model; use Think\Model\RelationModel; class UserModel extends RelationModel{ protected $_link = array( '关联' => array( '关联属性1' => '定义', '关联属性N' => '定义', ), ); } 

关于关联属性的定义和值,你可以到官方文档仔细查看,我们下面也会给出一些最常用的。

在我们的讲解例子中,会采用HAS_MANY和BELONGS_TO来演示,对于其他的几个关系模型,可以参考官方文档举一反三。

首先我们知道数据库里面有两张表,用户表和文章表,并且我们也为其创建了不同的模型(UserModel ArticelModel)。

现在我们仔细来想想他们之间的对应关系:一个用户可以拥有多篇文章,而每一篇文章都属于某个特定的用户。所以我们可以分别为这两种关系添加关联模型:

在UserModel中:

 protected $_link = array( 'Article' => self::HAS_MANY ); 

在ArticleModel中:

 protected $_link = array( 'User' => self::BELONGS_TO ); 

以上者两种都是最简洁的模型关联声明。因为在最开始设计数据库的时候,我们遵守了ThinkPHP的官方的规范:

外键的默认规则是当前数据对象名称_id,例如:UserModel对应的可能是表think_user,那么think_user表的外键默认为user_id,如果你的外键不是user_id,而是其他自定义的字段如:user_identify,那么就必须在定义关联的时候定义 foreign_key 。如下:

在UserModel中:

 protected $_link = array( 'mapping_type' => self::HAS_MANY, 'class_name'  => 'Article', 'foreign_key'  => 'user_identify', ); 

更多自定义的关联模型参数可以到官网查看。

有了以上的定义之后,我们就可以在检索用户数据的同时将属于他的文章也一起检索出来,使用relation()。

同样是在testDemo()这个方法中:

 $user = D('User'); $record = $user->relation(true)->find(4); dump($record); 

访问熟悉的http://localhost:8999/Home/User/testDemo,你将会看到神奇的结果。

以上所述就是本文的全部内容了,希望大家能够喜欢。

以上就是ThinkPHP模型详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:ThinkPHP模型详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址