ThinkPHP模型详解(3)

上面就是一些HTML代码和一点模板的知识,对于模板,我们后续会讲到,但不管怎样,现在我们访问
: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) )会触发自动验证并判断验证是否通过验证。你可以尝试在表单里填写不同的数据来进行测试,也可以修改一下验证规则,更多规则可以到官网查看:

关联模型

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

一对一关联 :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);

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/155517aed0440c3bee0bc17724f93f84.html