ThinkPHP模型详解
《:ThinkPHP模型详解》要点: 模型定义,默认情况下,ThinkPHP的模型类是位于/Home/Model/目录之下,模型类通常必要继承系统的ThinkModel类或其子类,下面是一个HomeModelUserModel类的定义:PHP实例 文件命名遵守UserModel.class.php的方式,跟控制器的命名一样 <?php namespace HomeModel; use ThinkModel; class UserModel extends Model { } 模型类的作用大多数情况是操作数据表的,如果依照系统的规范来命名模型类的话,大多数情况下是可以自动对应数据表,但你可以根据自己的需求来定制自己的数据表设置和操作.PHP实例 首先我们必要在配置文件设置我们的数据库连接信息:PHP实例 'DB_TYPE' => 'mysql','DB_HOST' => 'localhost','DB_NAME' => 'database','DB_USER' => 'username','DB_PWD' => 'password','DB_PORT' => '3306', 这些配置信息还是在/Home/Conf/config.php文件里设置.PHP实例 指定数据表前缀PHP实例 指定标前缀,我们在第一课的配置项已经指定,以下的笔墨表示你可以灵活配置你的数据表.PHP实例 protected $tablePrefix = 'top_'; 如果数据库的表没有表前缀,使用空字符串代替 protected $tablePrefix = ''; 指定数据表,此处的指定的数据表的不必要添加表前缀: protected $tableName = 'user'; 举个例子说,比如说你的数据库中有一个没有表前缀的,名为users的数据表,可以用以下的两种办法在模型中进行下面的定义:PHP实例 第一,直接根据系统的规范来命名模型类来命名模型,好比说就命名为UsersModel那么只需要在这个类里面加上下面的设置就可以了:PHP实例 protected $tablePrefix = ''; ThinkPHP系统就会自动定位到users表了.PHP实例 第二种情况时,如果你的模型类没有依照系统规范来命名,比如说不小心命名为UserModel,这种情况下可以同时指定表前缀和表明,比如:PHP实例 protected $tablePrefix = ''; protected $tableName = 'users'; 或者你直接指定trueTableName:PHP实例 protected $trueTableName = 'users';PHP实例 既然模型通常是用来操作数据表,那么我们来看看模型的基本CURD:PHP实例 注:为了方便演示,我们在UserController中定义一个testDemo()办法用于演示PHP实例 public function testDemo() { } 以下的代码将会一段一段在这个方法里演示,你可以通过拜访http://localhost:8999/index.php/Home/User/testDemo来看到实际效果.PHP实例 添加纪录PHP实例 $user = M('User'); $data['username'] = 'ThinkPHP'; $data['email'] = 'ThinkPHP@gmail.com'; $user->create($data); $record = $user->add(); dump($record); add()返回的是插入数据的id,对于不存在的表字段,add()办法会自动过滤.PHP实例 读取纪录PHP实例 在ThinkPHP中读取数据的方式很多,通常分为读取数据、读取数据集和读取字段值PHP实例 $user = M('User'); $record = $user->where('username="ThinkPHP"')->find(); dump($record); 读取字段值PHP实例 $user = M('User'); $record = $user->where('id=3')->getField('username'); dump($record); 默认情况下,当只有一个字段的时候,返回满足条件的数据表中的该字段的第一行的值.如果getField()传入多个字段,返回值将是一个关联数组:PHP实例 $user = M('User'); $record = $user->getField('username,email'); dump($record); 这个数组总是以传入的第一个第一个字段为键值的.如果修改为:PHP实例 $user = M('User'); $record = $user->getField('email,username'); dump($record); 将上面的两次代码分别放到testDemo(),你就会看到不一样的结果集.PHP实例 用save()办法更新数据PHP实例 $user = M('User'); $data['username'] = 'ThinkPHPSave'; $data['email'] = 'ThinkPHPSave@outlook.com'; $record = $user->where('id=3')->save($data); dump($record); 这里的$record返回的事1,表示成功更改.PHP实例 当然,你也可以这样:PHP实例 $user = M('User'); $user->username = 'ThinkPHP'; $user->email = 'ThinkPHP@outlook.com'; $record = $user->where('id=3')->save(); dump($record); 日常开发的时候经常会遇到一些只更新某些字段的情况,可以通过下面的方式来实现:PHP实例 $user = M("User"); $record = $user->where('id=4')->setField('username','ThinkPHPChangeName'); dump($record); 同时更新多个字段,可以将数据以数组的形式传给setField()办法:PHP实例 $user = M('User'); $data = array('username'=>'ThinkPHPChangeArray','email'=>'ThinkPHP@array.com'); $record = $user-> where('id=6')->setField($data); dump($record); ThinkPHP删除数据使用delete办法,例如:PHP实例 $user = M('User'); $record = $user->where('id=3')->delete(); dump($record); 或者你可以直接使用:PHP实例 $record = $user->delete('1,2,5'); dump($record); 这样就达到了删除主键1,5这三条纪录了.PHP实例 ActiveRecordsPHP实例 ThinkPHP实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录映射到对象.以下实例将使用ActiveRecords重现对数据表的CURD,看看ActiveRecords给我们带来了什么好处.PHP实例 $user = M("User"); $user->username = 'ThinkPHPWithActive'; $user->email = 'ThinkPHPActive@gmail.com'; $record = $user->add(); dump($record); 读取纪录PHP实例 AR最大的特点可能便是它的查询模式了,模式简单易用,因为更多情况下面查询条件都是以主键或者某个关键的字段.这种类型的查询,ThinkPHP有着很好的支持.PHP实例 好比说获取主键为2的用户信息:PHP实例 $user = M("User"); $record = $user->find(2); dump($record); 直接不用where()查询了,简单友好吧.再好比:PHP实例 $user = M("User"); $record = $user->getByUsername("jelly"); dump($record); 如果是查询多条纪录,使用以下方式:PHP实例 $user = M("User"); $record = $user->select('1,3,8'); dump($record); 更新记录PHP实例 $user = M("User"); $user->find(21); $user->username = 'TOPThinkChangeWithAR'; $record = $user->save(); dump($record); 删除记录PHP实例 删除单条纪录 $user = M("User"); $record = $user->delete(8); dump($record); 删除多条纪录 $user = M("User"); $record = $user->delete('15,16'); dump($record); // todo: 这里的自动验证和关联模型 调试不出来. 自动完成PHP实例 自动完成是ThinkPHP提供用来完成数据自动处理和过滤的办法,当使用create()办法创建数据对象的时候会触发自动完成数机制. 因此,在ThinkPHP鼓励使用create()方法来创建数据对象,因为这是一种更加平安的方式,直接通过add()或者save()方法实现数据写入无法出发自动完成机制.PHP实例 自动完成通常用来完成默认字段写入(比如添加时间戳),平安字段过滤(比如加密密码)以及业务逻辑的自动处理等.可以通过模型类里面通过$_auto属性定义处理规则.下面演示如何自动完成添加时间戳:PHP实例 在UserModel中,声明自动完成的定义数组$_auto :PHP实例 protected $_auto = array ( array('created_at','date("Y-m-d H:i:s",time())','function'),array('updated_at',); 还有一种是理由auto()办法动态设置自动完成的机制,可以到官方文档去看看PHP实例 设置完成之后,我们在testDemo()办法中创建一条用户数据:PHP实例 $user = D('User'); $data['username'] = "ThinkPHP"; $data['email'] = "ThinkPHP@gmail.com"; $user->create($data); $record = $user->add(); dump($record); 测试,如果返回纪录的id值,说明用户纪录创建成功.要验证数据是否自动完成,你可以直接使用:PHP实例 $user = D('User'); $record = $user->find(id); dump($record); 自动验证PHP实例 自动验证是ThinkPHP模型层提供的一种数据验证办法,可以在使用create()创建数据对象的时候自动进行数据验证.PHP实例 数据验证可以进行数据类型、业务规则、平安判断等方面的验证操作.PHP实例 通常用于表单验证PHP实例 数据验证有两种方式:PHP实例 静态方式:在模型类里面通过$_validate属性定义验证规则.PHP实例 动态方式:使用模型类的validate()办法动态创建自动验证规则.PHP实例 无论是什么方式,验证规则的定义是统一的规则,定义格式为:PHP实例 array( 在UserController中创建register()办法,对,几乎每一个Web应用都需要实现用户注册这一步. public function register() { $this->display(); } 对,就是这么简单,这个办法只是将相应的视图文件渲染出来.所以接下来我们创建对应的视图文件,也就是:./Application/Home/View/User/register.htmlPHP实例 <extend name="Index/base" /> <block name="main" > <form method="post" action="__URL__/registerValidate"> <div class="form-group"> <label for="exampleInputName">Name</label> <input type="text" name="username" class="form-control" id="exampleInputName" placeholder="Name"> </div> <div class="form-group"> <label for="exampleInputEmail">Email</label> <input type="email" name="email" class="form-control" id="exampleInputEmail" placeholder="Email"> </div> <button type="submit" class="btn btn-default">Submit</button> </form> </block> 上面就是一些HTML代码和一点模板的知识,对于模板,我们后续会讲到,但不管怎样,现在我们拜访 注意到form表单中,action="__URL__/registerValidate",这表示提交到当前的控制器的registerValidate()办法处理,所以我们在UserController中增加registerValidate()办法:PHP实例 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) )会触发自动验证并判断验证是否通过验证.你可以尝试在表单里填写不同的数据来进行测试,也可以修改一下验证规则,更多规则可以到官网查看:PHP实例 http://document.thinkphp.cn/manual_3_2.html#auto_validatePHP实例 关联模型PHP实例 通常我们所说的关联关系包含下面三种:PHP实例 一对一关联 :ONE_TO_ONE,包含HAS_ONE 和 BELONGS_TO 关联定义PHP实例 ThinkPHP可以很轻松的完成数据表的关联CURD操作,目前支持的关联关系包含下面四种: namespace HomeModel; use ThinkModelRelationModel; class UserModel extends RelationModel{ protected $_link = array( '关联' => array( '关联属性1' => '定义','关联属性N' => '定义',),); } 关于关联属性的定义和值,你可以到官方文档仔细查看,我们下面也会给出一些最常用的.PHP实例 在我们的讲解例子中,会采用HAS_MANY和BELONGS_TO来演示,对于其他的几个关系模型,可以参考官方文档举一反三.PHP实例 首先我们知道数据库里面有两张表,用户表和文章表,并且我们也为其创建了不同的模型(UserModel ArticelModel).PHP实例 现在我们仔细来想想他们之间的对应关系:一个用户可以拥有多篇文章,而每一篇文章都属于某个特定的用户.所以我们可以分别为这两种关系添加关联模型:PHP实例 在UserModel中:PHP实例 protected $_link = array( 'Article' => self::HAS_MANY ); 在ArticleModel中:PHP实例 protected $_link = array( 'User' => self::BELONGS_TO ); 以上者两种都是最简洁的模型关联声明.因为在最开始设计数据库的时候,我们遵守了ThinkPHP的官方的规范:PHP实例 外键的默认规则是当前数据对象名称_id,例如:UserModel对应的可能是表think_user,那么think_user表的外键默认为user_id,如果你的外键不是user_id,而是其他自定义的字段如:user_identify,那么就必需在定义关联的时候定义 foreign_key .如下:PHP实例 在UserModel中:PHP实例 protected $_link = array( 'mapping_type' => self::HAS_MANY,'class_name' => 'Article','foreign_key' => 'user_identify',); 更多自定义的关联模型参数可以到官网查看.PHP实例 有了以上的定义之后,我们就可以在检索用户数据的同时将属于他的文章也一起检索出来,使用relation().PHP实例 同样是在testDemo()这个办法中:PHP实例 $user = D('User'); $record = $user->relation(true)->find(4); dump($record); 拜访熟悉的http://localhost:8999/Home/User/testDemo,你将会看到神奇的结果.PHP实例 以上所述便是本文的全部内容了,希望大家能够喜欢.PHP实例 《:ThinkPHP模型详解》是否对您有启发,欢迎查看更多与《:ThinkPHP模型详解》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |