版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、TP 的手册相当多,其实不必再出这样的贴子,论技术,我也是菜鸟一个,同时也在学 习当中。看到论坛上多了不少新朋友,不少在抱怨手册看不懂,那我就姑且抛砖引玉, 尝试 与新朋友们更简单地、手把手地进入TP的应用中去。讲解过程中有错的地方,大家帮忙指正。这个系列,初步定下的目标为, 从零开始,以TP示例中心中的Form为例进行讲解,以实践 为主,理论为辅,将 TP的最基本内容逛一遍,至少让我们一起学会如何进行最简单的对数 据进行查、增、改、删操作并输出到模板。由于我们说的是循序渐进, 所以我用步骤式来说明, 只要一步一步跟着做, 相信聪明的你在 使用过程中就会明白 TP的应用了。注意:以下的步骤,仅
2、仅是TP灵活的布署方式其中一种,实际开发中可以根据自己的情况去另行设定。 至于为什么那样做, 我们会在最后再作总结, 我觉得先实操然后再进行说明比 较容易明白。以下不再重复解释。一快速开始一个项目名词解释:项目:你要开发的系统,称之为项目。入口文件: 你可以理解为这个项目的唯一的一道门, 以后所有的操作都会通过这道门去执行 处理。不必理会什么意思,你甚至可以先把它看成是就是入口文件TP: ThinkPHP 框架的简称1下载正式版2拟好你的项目名称,我们这里以 Myapp 为项目名称3在wwW根目录下,将TP框架所有文件全部复制过去,文件夹名称是ThinkPHP4与ThinkPHP同级新建一个文
3、件夹,起名为Myapp,也就是项目名称5在wwW根目录下,创建一个PHP文件,起名,这就是入口文件入口文件代码:display() 方法来直接 调用该模板。 (当然也可以调用其它模块下的其它模板或显式指定模板文件位置和名称,由于是循序渐进式的学习, 就让我们先忽略吧) 了解这些理论后, 我们先简单实操一下这些知 识。1在 Myapp/Tpl/default/ 下建立一个文件夹,根据应用模块的名称,我们将这个文件夹命名为 Index2在 Myapp/Tpl/default/Index/ 下建立一个 html 文件,根据操作名称,我们命名该文件为assign(name,$value);$this-
4、display();代码知识要点(摘自手册:ThinkPHP模板指南,此后的知识要点均来自TP官方手册,不再申明)在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值。$this-assign(name,$value);taccess 文件,内容是RewriteEngine onRewriteCond %REQUEST_FILENAME !-dRewriteCond %REQUEST_FILENAME !-fRewriteRule 人(.*)$ $1 QSA,PT,L如果你的服务器环境支持 rewrite ,使用就可以正常访问到 Ind
5、ex 模块的 index 操作了。 此 后我们的学习中用到的 URL都是假定你使用了 rewrite 的情况第六节CURD知识之一 C创建(create)从这一节开始,我们就要涉及到数据库操作,TP对数据库的操作非常简便,以下是一些基础知识讲解。名词解析:CURD代表数据库四个基本操作:创建:create ,更新:update,读取:read,删除:delete模型对象: 即数据对象,你项目里每一个 Model 类文件都会对应着一个数据表 (或者视图 ), 模型与数据表存在一种映射关系。TP约定了命名要遵循一定的规范,如果不符合,则需要根据情况进行额外的相应设置。例如 Model 类的 tab
6、leName 属性- 模型 (M)同时也在 Myapp/Lib/Action/ 下添加了一个 Index 应用模块和写下了一个 index 操作 - 控制器(C)并且在Tpl目录下建立了与之对应的模板目录Index及模板文件 视图(V)MVC莫式的开发已体现了出来。tdweb曾简明扼要地概括了TP中这三者的关系,C的作用,就是从 M中取得数据到 V,使用TP以表单提交数据到库,流程和你所了解的表单提交没有什么区别,只是TP简化了数据操作的处理过程。我们在实际操作中体会一下。先来看看我们所定义的数据表 form 的字段:id, 下面主要说说 function 与 callback 这两个附加规则
7、。protected $_auto=array( array(create_time,time,ADD,function),);上面 create_time 代表了要处理的字段, 填充内容是 time ,附加规则是 function 使用函数, 填充条件是ADD新增时处理,那么整行代码表示对create_time 字段在新增的时候使 time函数作为该字段的值进行自动填充。再看一个 function 作为附加规则的例子 protected $_auto=array( array(password,md5,ADD,function) , );当使用 function 作为附加规则时,第二个填充内
8、容就代表了这个因子是一个函数名称,该 函数的参数就是代表填充字段的值,比如 password 的值是 123456,则上面的代码会先将这 个值使用函数 md5(123456) ,这样处理后再插入到数据表中去。对于 function (函数)和 callback (回调方法)理论是一样的,只不过一个是表示填充内容所写的是函数名,另一个是表示填充内容是类中的方法名。函数可以是PHP5内置函数或你自己所写的函数。而 callback 是当前模型类所能调用的一个方法。有关数据填充方面的详细资料,请参看官方使用手册ThinkPHP数据操作指南2 打开 Myapp/Tpl/default/Index/ 文
9、件,我们修改代码将 form 写进去VDOCTYPE HTML PUBLIC - 返 回 );步1:将根目录中的原剪切并粘贴到Myapp文件夹下。更改代码为:php/ThinkPHP);J/);taccess 文件复制一份粘贴到 Myapp 目录下。步3: 将Cache目录,Temp目录,Data目录清空。说明2第五节中对于 URL访问的默认模式在dev版默认配置中,dispatch即URL调度功能是关闭的,所以在默认模式下,要访问Index 模块的index操作,地址应是:m=index&a=index,m指的是模块变量(Model),a 指的是操作 变量 (Action) 。如果要使用类似
10、第五节中的 moduleName/actionName 方式, 则要在文件里设置 DISPATCH_ON 为true;并且,也只有开启了此功能后,URL_MODE的设置才会有效。(在上面的章节我们提及过,可以设置URL_MODE为2来使用rewrite 功能去除显示所以,现在我们的代码是mysql,那么再来看看我们所定义的数据表 form 的字段:id, 使用ADD | UPDATE | ALL会无效的(TO流年大哥:TP代码还有一个特色就是函数或 方法的命名很符合语言使用习惯,原来的 add,update,all 很直观,易记,可惜没了 ) array(field, 填充内容 , 填充条件
11、, 附加规则 , 额外参数 ) alias_import($alias,$classfile=)快速定义和别名导入这是新增的函数,我尝试注解一下,不正确请指正。该函数可以动态设置文件列表导入和直接导入文件,常会用到的文件别名有 当要引入已定义别名的文件,我们只要直接在参数中传递别名就行了。别名可以自行在 Th in kPHP/Commo n冲扩充。 除了使用已定义的别名外,也可以使用动态指定。alias_import(zzg,APP_PATH./Lib/ORG/);或一次引入多个文件$ailias=array(Abc= APP_PATH./Lib/ORG/,Efg =APP_PATH./Lib
12、/Other/,);alias_import($ailias);注:指定文件或别名不存在时会返回 false类似的函数还有import($class,$baseUrl = ,$ext=.)由于性能问题,这个方式以后不再支持这是 ThinkPHP 内建的类库和文件导入的一个函数 , 具有缓存和检测机制, 相同的文件不会重 复导入,冲突时会提示错误。使用这方法时,系统会自动识别导入类库文件的位置:Think 代表TP框架基类库 即ThinkPHP/Lib/Think目录ORG代表第三方公共类库即ThinkPHP/Lib/ORG目录TP的约定是Think、ORG等导入的是以系统(TP)基类库为相对起
13、始目录,否则就认为是项目(Myapp) 应用类库为起始目录。注意 1 使用时要注意文件名的大小写注意 2 Import 会自动将 . 转换为 / ,如果文件名中含有 . ,则要将 . 改为 #才能正常导入。 注意 3 导入的类文件后缀默认是 .2第三方框架类库导入: vendor($class,$baseUrl = ,$ext=.php),起始目录统一是 ThinkPHP/Vendor 默认后缀是 .php注: vendor 也使用了 Import 函数。因此 .说明3,原来的模板文件保持不变,因为我们已启用了DISPATCH_O开关。仅将Myapp/Lib/Action/ 如下select(
14、); 返 回 );$rs =$Form-add(); 返 回 );oxwidth:600px;margin:10px auto;border:1px dashed #e8e8e8;padding:5px;.submitheight:2em;padding:0 5px;cursor:pointer;标题: 在浏览器中输入,可以看到现 在已将数据显示在模板了由E箱: vpxlabel for=c onten t内容:$:$- 由$发表于:$|date=Y-m-d,# 内容:$.由Micdr底发表于T 200Q- D卡.討111迅疋业足_怖速,简单的面冋对续旳轻量毂PHP开发稚茱NO.1测述数抓內帘
15、这时我们只要每输入一条数据信息,就会按照id倒序的方式显示在模板上。现在模板显示已设定好,我们来一起学习查询的各种方法:先了解一个TP词汇:连贯操作 所谓连贯操作,是 TP利用_call方法来实现的一些特殊的 Model类方法,可以对数据对象 连续调用数个方法(参数)来设定特定的条件,然后执行最终所指定的操作, 这类特定方法的 命名都很直观易记,主要方法 (参数)有用于查询表达式的field 参数支持如下键名table 指定表名称,可以跨表访问,若不填则是当前 DAOdistinct 指定是否只列出不重复数据,如果想列出不重复数据,则为 true ,不填则无此功 能field 指定要搜索的字段
16、,不填则为 *join 填写 join ,可以支持数组或者直接使用字符串, 如果是字符串, 那么只支持 LEFT JOIN, 如果想使用RIGHT JOIN,那么只能使用数组定义,并且必须写清 RIGHT JOIN where指定查 询条件where 可以多说点,功能很多。首先说最简单的字符串查询,直接执行就OK 了。使用数组指定查询条件$whereArr=array(account=tdweb,home=China);$options=array(where=$whereArr);$Dao-select($options);这样默认是查询 SELECT * FROM test WHERE (
17、 accou nt = tdweb ) AND ( home =China ) 是查询相等条件的。那如果我想查询 like 条件怎么办解决方法之一是定义LIKE_MATCH_FIELD配置,这里指明要进行like查询的字段。现在我们稍微改下程序public function testDb()C(LIKE_MATCH_FIELDS,account);$Dao=D(Test);$whereArr=array(account=tdweb,home=China);$options=array(where=$whereArr);dump($Dao-select($options);echo $Dao-g
18、etLastSql();得到的 SQL就是 SELECT* FROMtest WHERE accountLIKE %tdweb% ) AND( home= China )接着,可以看如下代码public function testDb()$Dao=D(Test);$whereArr=array(account=array(eq,tdweb),home=array(like,%Chi%), age=array(between,1,3);$options=array(where=$whereArr); dump($Dao-select($options);echo $Dao-getLastSql(
19、);这里的 $whereArr 定义为一个二级数组,没一个字段都定义了一个数组,这样可以支持更高 级复杂的查询。其中支持的关键字:EQ 相等NEQ 不相等GT 大于EGT 不大于LT 小于ELT 不小于NOTLIKE 不相似LIKE 相似NULL 空NOTNULL不为空EXP 使用自己写的表达式同样, select 也支持一个名为“ _after_select ”的回调方法如何去消化这段内容,将在下一节以我们的实例Myapp中实操去体会。第 8 节 视图查询Thin kPHP提供了视图查询应用,利用视图查询可以将多个数据表的字段内容按需要进行指 定和筛选, 组织成一个基于这些数据表的视图模型,
20、 然后就可以通过该模型直接进行多表联 合查询,非常方便和简单。例如在项目中,我们定义有三个表,user 用户基础表 , user_info 用户详细信息表, dept 部门分类表 现在我们需要获取某个用户信息, 该信息要包括用户的帐号名称和相关资料与及所在部门的 名称,这时候我们可以利用视图查询进行处理。让我们在实际操作中去体会。1构建一个新项目并进行相关配置 (可参考前面的教程,这里省略 )2创建一个数据库 tpview ,并添加这三个表用户表CREATE TABLE thi nk_user (id int(11) unsigned NOT NULL AUTO_INCREMENT COMME
21、NT ID编号:name varchar(20) NOT NULL COMMENT 帐户,password varchar(32) NOT NULL COMMENT 密码,、dept_id smalli nt(6) un sig ned NOT NULL,status tinyint(1) unsigned NOT NULL DEFAULT 1 COMMENT 开放状态 ,PRIMARY KEY (id) ENGINE=MyISAMDEFAULT CHARSET=utf8 COMMENT= 会员表 AUTO_INCREMENT=2 ; INSERT INTO think_user (id, n
22、ame, password, dept_id, status)VALUES(1, zzguo28, 123456, 2, 1);用户信息表CREATE TABLE think_user_info (user_id int(11) NOT NULL COMMENT 用户 id,nick_name varchar(30) NOT NULL COMMENT 用户昵称 ,email varchar(100) NOT NULL COMMENT 邮箱地址 ,address varchar(100) NOT NULL COMMENT 详细地址 ,gender tinyint(1) NOT NULL DEFA
23、ULT 0 COMMENT 性别,mobile varchar(100) NOT NULL COMMENT 手机号码 ,telephone varchar(100) NOT NULL COMMENT 电话号码 ,KEY user_id (user_id)ENGINE=MylSAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=用户信息 表;INSERT INTO think_user_info(user_id, nick_name, email, address,gender, mobile, telephone) VALUES(1, 国路 t
24、hink 街号部门分类表CREATE TABLE think_dept (id smallint(3) NOT NULL AUTO_INCREMENT,name varchar(50) NOT NULL,PRIMARY KEY (id) ENGINE=MyISAMDEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;INSERT INTO think_dept (id, name) VALUES(1, 开发部),(2, 销售部),(3, 财务部);3在项目 /Lib/Model 下创建这三个表的基础模型 Model 本示例没涉及到验证等其它功能,所以只要简单定义测可,例
25、如其实视图模型对应的数据表并非一定要有相应的的基础模型, 但是建议您创建, 这样单表和 视图都可以操作。4创建视图模型,代码如下,详细注解见其后 :别名定义 ,_on= 筛选条件 ,_type= 三种),因为 User 模型里面已经存在了一个 name 字段, dept 字段,如果有多个字段,可以Dept 模型的 name 字段映射为( 最新 svn 上已增加动态扩展模型功能, 使用新版需要将 protected 属性改为 public 属性, 建议使用动态扩展功能去使用视图查询,而不再是本教程的继承方式。那样使用会更灵活。array(id,name,_as=u,_type=left),Use
26、rInfo=array(email,mobile,_as=ui,_on=),Dept =array(name=dept,_on=),);逐行解释上面的代码:在行 2 代码中,因为版已将视图查询分离出原 Model 类,所以这里需要使用 import 方法引 入了视图模型类。行 3 代码中,定义了该模型名称为 UserViewModel ,视图模型的名称 Model 前的命名是随意 的,只是为了有别于其它模型,通常我们会以 xxxViewModel 这样的方式去命名。并且一定 要继承 ViewModel 。版无需再设置模型的 viewModel 属性为 true ,只要继承 ViewModel
27、则可 ) 第四行代码 $viewFields 属性表示视图模型包含的字段, 每个元素定义了各个数据表或者模 型所需的字段。格式是protected $viewFields = array( 表名 =array( 所需字段 ,_as= 指定 join 类型,支持 right,inner,left );是否留意到行 7 代码中的 name=dept 所以我们通过这种方式把 使用同样的方式添加。定义完毕后,我们在 Action 中进行测试,代码如下where($where)-find(); dump($dao-getLastSql(); 然后访问该操作,可以看到我们成功取得所需的查询内容: arra
28、y(1) 0 = array(5) id = string(1) 1 name = string(7) zzguo28dept = string(9) 销售部 并可以看到使用的 sql 如下SELECT AS id, AS name, AS email, AS mobile, AS dept FROMthink_user u LEFTJOIN think_user_info ui ON =JOIN think_dept Dept ON = WHERE ( = 1 ) LIMIT1 视图模型在查询上和普通单表并没有多大分别, 可以使用我们所熟悉的各种连贯操作, 例如 order,limit 这些
29、。不过视图模型只能用于查询,要关联更新写入可以使用关联模型第 9 节 关联操作ThinkPHP 高级模型类中提供了对关联操作的支持。由于关联查询在定义和操作方面相对来 说略显复杂, 如果仅仅是一对一的关联查询, 官方建议采用视图模型的方式或直接使用连贯 操作进行处理。掌握关联操作的使用, 重点在于理解如何定义模型之间的关联关系, 只要理清了规则和脉络, 其实使用起来也并不算复杂,对于需要同时对多表进行写入、 更新、查询和删除的情况,比 起在项目中使用分步处理各个数据表的方式, 关联操作仍然是一个不错的选择, 而且在效率 上并不会相差多少。下面我们以一个实例来讲述表的关联操作简单用法。需求分析
30、: 在一个项目中,需要建立一个全面的会员资料档案,这个档案要包括: 会员的基本资料 ;会员的详细资料 ;会员所在地区:东区、南区、西区、北区 ;会员的兴趣群组:琴、棋、书、画 ; 会员持有的兴趣消费卡; 数据表初步拟定:user 会员基本表user_info 会员详细资料表area 地区表group 兴趣群组表card 消费卡帐号记录表TP支持的关联关系包括:HAS_ONE 1BELONGS_TO 2HAS_MANY 3MANY_TO_MANY 4 数据表关联分析:1所有的资料都是以会员来联系,因此我们将以会员基本表 user 为核心。2每个会员都有一份自己的详细资料,属于一对一关系,因此us
31、er_info 表使用 HAS_ONE关联3每个会员都属于其中一个地区,是从属关系,因此area表使用BELONGS_T关联4 会员的兴趣可能是一种或几种,各种兴趣自然也有多个用户,是多对多关系,因此group表使用MANY_TO_MA关联5每个会员的兴趣消费卡帐号可以有多个,是一对多关系,因此card表使用HAS_MAN关联6 由于将以 user 表为核心读取关联, 会员表 user 和兴趣群组表 group 之间需要一个中间表 作关联。TP关联操作的中间表定义有个默认规则(主表_关联表),如果不是这种形式,可以使用relation_table 属性进行设置。这里使用默认规则,所以要多添加一
32、个表 user_group 作为中间表。理清结构后, 我们构建一个项目应用并进行配置, 然后在数据库中建立上面分析出来的数据表会员基本表CREATE TABLE thi nk_user (id mediumi nt(6) NOT NULL AUTO_INCREMENT,name varchar(25) NOT NULL COMMENT 名称,area_id smallint(3) NOT NULL COMMENT 地区 id,PRIMARY KEY (id) ENGINE=MyISAMDEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;会员详细资料表CREATE TA
33、BLE think_user_info (id mediumint(6) NOT NULL AUTO_INCREMENT,user_id mediumint(6) NOT NULL COMMENT 会员 ID,email varchar(255) NOT NULL COMMENT 邮箱地址 ,nickname varchar(50) NOT NULL COMMENT 昵称,PRIMARY KEY (id)ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT 详细资料 表 AUTO_INCREMENT=1 ;地区表CREATE
34、 TABLE think_area (id smallint(3) NOT NULL AUTO_INCREMENT COMMENT 地区 id 编号,name varchar(50) NOT NULL COMMENT 地区名称 , PRIMARY KEY (id)ENGINE=MylSAMDEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT地区表 AUTO_INCREMENT=5 ;INSERT INTO think_area (id, name) VALUES(1, 东区 ),(2, 南区 ),(3, 西区 ),(4, 北区 );兴趣群组表CREAT
35、E TABLE think_group (id mediumint(6) NOT NULL AUTO_INCREMENT,name varchar(50) NOT NULL COMMENT 群组名, PRIMARY KEY (id) ENGINE=MyISAMDEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;INSERT INTO think_group (id, name) VALUES(1, 琴 ),(2, 棋),(3, 书),(4, 画);消费卡帐号记录表CREATE TABLE thi nk_card (id mediumint(6) NOT NULL AU
36、TO_INCREMENT COMMENT 消费卡 ID 编号:user_id mediumint(6) NOT NULL COMMENT 会员 ID 编号 ,card varchar(25) NOT NULL COMMENT 消费卡帐号 ,PRIMARY KEY (id)ENGINE=MylSAMDEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT=兴趣消费 卡表 AUTO_INCREMENT=5 ;会员与群组的中间表CREATE TABLE think_user_group (id mediumint(6) NOT NULL AUTO_INCREME
37、NT,group_id mediumint(5) NOT NULL COMMENT 群组 ID,user_id mediumint(5) NOT NULL COMMENT 会员 ID,PRIMARY KEY (id) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;关联操作必需建立基础表,在项目配置文件里面定义好数据库的连接信息后,我们在 项目 /Lib/Model 下对应数据表建立各个基础模型类 (中间表无需建立模型 )会员表注意: 关联操作只需要在主表中定义关联,其他模型无需再定义关联关系。 如果是版, 需要 注意 $_link 属
38、性要为 public 。 )array(mapping_type= BELONGS_TO,mapping_name= Area,class_name = Area,foreign_key = area_id,),);没有定义该属性时数据类似于:面代码中, mapping_type,foreign_key . 这些,就是 允许定义的属性- 所有可定义的属性概述 - mapping_type用以定义该表与主表的关联类型 mapping_type 所定义的内容必须是常量,共有下面四种方 式:HAS_ONE表示当前模型(主表)拥有一个子对象,例如本例中的usernfo ,每个会员对应一个资料表Belo
39、ngs_to 表示当前模型从属于另外一个父对象,例如每个会员都从属于一个地区HAS_MAN表示当前模型拥有多个子对象,例如每个用户有多个兴趣消费卡MANY_TO_MAN表示当前模型可以属于多个对象,而父对象则可能包含有多个子对象,通常 两者之间需要一个中间表类约束和关联。 例如本例中的每个会员可以属于多个兴趣组, 每个 兴趣组可以有多个用户class_name要关联的模型类名称。例如示例代码所定义的 Area ,再次提醒,一定要确保已定义了此模型类 (AreaModel) 。 mapping_name 关联的映射名称,用于获取数据用,作为数据集中与主表字段并列的数据索引。该名称不能与当前模型的
40、字段重复,否则会导致关联数据获取的冲突mapp ing_name没有定义的话,会取 class_name的定义作为 mapping_name。即模型类名称 foreign_key 关联的外键名称foreign_key 如果没定义,则默认是 当前数据对象名称 +_id 作为外键例如: UserModel 对应的表是 think_user( 注意: think 只是一个数据表前缀,可以随意配 置)那么 think_user 表的外键默认为 user_id ,如果不是,就用该属性进行显式指定,例如数 据表定义的外键是 userId, 则使用 foreign_key=userId, 这种方式去申明Co
41、ndition关联条件, 在关联查询的时候会自动带上外键的值, 如果有额外的查询条件, 可以使用该属 性进行定义mapping_fields关联要查询的字段 如果没有定义,默认关联查询的关联数据是该关联表的全部字段。 如果仅仅是需要查询其中的个别字段,可以使用该属性进行指定as_fields直接把关联的字段值映射成数据对象中的某个字段这个特性是 ONE_TO_ON包括HAS_ONE和BELONGS_TC关联关系特有的,可以直接把关联数据映射到数据对象中, 而不是作为一个关联数据。 例如当 关联数据的字段名和当前数据对象的字段名称有冲突时,可以使用下面这种方式进行定义:as_fields=ema
42、il,nickname:username,id = string(1) 2name = string(8) thinkphpCard = array(1) 0 = array(1) 如果定义了映射,则类似于 id = string(1) 2 name = string(8) thinkphp parent_key 自引用关联的关联字段默认为parent_id (BELONGS和HAS_MAN才有此属性) 自引用关联是一种比较特殊的关联,也就是关联表就是当前表。 mapping_limit关联要返回的记录数目(HAS_MANY口 MANY_TO_MANY有此属性) mapping_order关联
43、查询的排序 (HAS_MANY口 MANY_TO_MANY有此属性) relation_foreign_key 关联表的外键名称(MANY_TO_MAN独有属性)默认的关联表的外键名称是表名+_id例如本示例中的 relation_foreign_key 是 group_id如果不符合,可通过此属性进行指定relation_table关联的中间表名称(MANY_TO_MAN独有属性)如果没有设置该属性,默认通过当前模型的 getRelationTableName 方法来自动获取例如当前模型是 User,关联模型是 Group,那么关联表的名称会默认使用user_group这样的格式。默认的中间
44、表命名规则是:如果两个表存在一个对应的中间表,该中间表的命名方式为 数据表前缀 +_ +关联操作的主表名 +_+关联表名 例如本示例中,由 think_user 表操作关联表 , 所以和 think_group 表的中间表名称是 think_user_group ,如果是从 think_group 表来操作, 那么中间命名是 think_group_user , 也就是说, 多对多关联的设置, 必须有一个 Model 类里面需要显式定义中间表, 否则双向操 作会出错。另外,中间表的字段无需要有 id 主键, (不过就算建立了这个字段也不会影响中间表操作的 ) 中间表通常只是由 user_id
45、和 group_id 构成就可以了。 如果中间表不符合上面的规则,则需要通过该属性去显式指定中间表名称。 各种关联关系类型可用属性归纳如下,使用中可对照此表和参考上面定义解释HAS_O NE可用属性 mapping_type class_name mapping_name foreign_key condition mapping_fields as_fieldsBELONGS(可用属性mapping_name foreign_key mapping_fields condition parent_key as_fieldsHAS_MANY可用属性mapping_name foreign_key parent_key mapping_fields mapping_limit mapping_orderMANY_TO_MAN可 用属性mapping_name foreign_key elation_for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 品质魔方测试题目与答案
- 2025-2026学年广西壮族崇左市大新县数学四年级下学期期中检测模拟试题含答案
- 中医神经外科模拟试题及答案解析
- 超有趣的压力测试题目及答案
- 肝衰竭题目题库及答案
- 2026反洗钱自查报告(3篇)
- 培养基制备练习题及详细答案
- 2026年非金属矿物制品业重晶石粉应用拓展
- 2026年海南省高中政治必修第二册第7单元经济生活课件
- 雨污水顶管及竖井专项施工方案专家论证方案
- 2026年宁波高新区机关各部门、事业单位及街道公开招聘30名编外人员笔试参考题库及答案详解
- 2026-2030中国冬瓜种植市场营销模式与投资战略研究研究报告
- 2026年宁夏高考物理试卷(含答案及解析)
- 2026年下半年幼儿园教师资格证《保教知识与能力》真题试卷
- 2026年公共卫生执业医师资格考试(第一单元)试卷真题(后附答案解析)
- 中医体质辨识评估流程
- 广东粤财投资控股有限公司2026春季校园招聘笔试历年典型考点题库附带答案详解
- 2026年4月18日衢州市属事业单位选调笔试真题及答案深度解析
- 律所内部管理制度大全
- 旋挖钻孔灌注桩施工方案模板
- 安徽省合肥市普通高中六校联盟2025-2026学年高二上学期11月期中考试英语试卷(含答案)
评论
0/150
提交评论