天天看点

ThinkPHP关联模型详解

        在ThinkPHP中,关联模型更类似一种mysql中的外键约束,但是外键约束更加安全,缺点却是在写sql语句的时候不方便,ThinkPHP很好得解决了这个问题.但是很多人不动关联模型的意思.现在就写个例子.让大家理解ThinkPHP关联模型的意思.

        环境描述:公司有一个员工表think_user,一个档案表,think_archives,一个部门表,think_department,和一个银行卡表.think_cars.

        一个员工只有一个档案表,所以关系就是HSA_ONE,

        一个员工只属于一个部门,但是部门里有多个员工,所以是BELONGS_TO关系

        一个员工有多个银行卡,但是一个银行卡只能属于一个员工.所以关系就是HAS_MANY.

        先创建需要的表和测试数据

       think_user表.

1

2

3

4

5

6

7

<code>CREATE</code> <code>TABLE</code> <code>`think_user` (</code>

<code>  </code><code>`id` </code><code>int</code><code>(11) </code><code>NOT</code> <code>NULL</code> <code>AUTO_INCREMENT,</code>

<code>  </code><code>`username` </code><code>varchar</code><code>(50) </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`</code><code>password</code><code>` </code><code>varchar</code><code>(50) </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`did` </code><code>int</code><code>(11) </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>  </code><code>PRIMARY</code> <code>KEY</code> <code>(`id`)</code>

<code>) ENGINE=InnoDB </code><code>DEFAULT</code> <code>CHARSET=utf8 |</code>

        think_department

<code> </code><code>CREATE</code> <code>TABLE</code> <code>`think_department` (</code>

<code>  </code><code>`</code><code>name</code><code>` </code><code>varchar</code><code>(50) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

        think_archives

8

<code>CREATE</code> <code>TABLE</code> <code>`think_archives` (</code>

<code>  </code><code>`id` </code><code>int</code><code>(7) </code><code>NOT</code> <code>NULL</code> <code>AUTO_INCREMENT,</code>

<code>  </code><code>`uid` </code><code>int</code><code>(11) </code><code>NOT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`addr` </code><code>varchar</code><code>(200) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`email` </code><code>varchar</code><code>(30) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`tel` </code><code>int</code><code>(13) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

think_cars

<code>CREATE</code> <code>TABLE</code> <code>`think_cars` (</code>

<code>  </code><code>`type` </code><code>varchar</code><code>(50) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

<code>  </code><code>`uid` </code><code>int</code><code>(11) </code><code>DEFAULT</code> <code>NULL</code><code>,</code>

<code>) ENGINE=InnoDB </code><code>DEFAULT</code> <code>CHARSET=utf8</code>

插入数据到部门表think_department

<code>insert</code> <code>into</code> <code>think_cars </code><code>values</code>

<code>     </code><code>(</code><code>null</code><code>,</code><code>'gongxiang'</code><code>,</code><code>'工商卡'</code><code>,</code><code>'1'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,</code><code>'jianshe'</code><code>,</code><code>'建行卡'</code><code>,</code><code>'2'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,</code><code>'jiaohang'</code><code>,</code><code>'交通银行卡'</code><code>,3);</code>

think_user数据

9

10

<code>insert</code> <code>into</code> <code>think_archives </code><code>values</code>

<code>     </code><code>(</code><code>null</code><code>,1,</code><code>'北京'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'13888888'</code><code>),</code>

<code>    </code><code>(</code><code>null</code><code>,2,</code><code>'上海'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1377777'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,3,</code><code>'重庆'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1344444'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,4,</code><code>'天津'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1111111'</code><code>),</code>

<code>    </code><code>(</code><code>null</code><code>,5,</code><code>'山西'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1322222'</code><code>),</code>

<code>   </code><code>(</code><code>null</code><code>,6,</code><code>'河北'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1333333'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,7,</code><code>'广州'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'13232323'</code><code>),</code>

<code>    </code><code>(</code><code>null</code><code>,8,</code><code>'广东'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'121121212'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,9,</code><code>'深证'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1821212'</code><code>);</code>

think_cars数据

<code>    </code><code>(</code><code>null</code><code>,</code><code>'jianshe'</code><code>,</code><code>'建行卡'</code><code>,</code><code>'2'</code><code>),</code>

<code>    </code><code>(</code><code>null</code><code>,</code><code>'jiaohang'</code><code>,</code><code>'交通银行卡'</code><code>,3);</code>

<code>Query OK, 3 </code><code>rows</code> <code>affected (0.01 sec)</code>

think_archives

<code>     </code><code>(</code><code>null</code><code>,2,</code><code>'上海'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1377777'</code><code>),</code>

<code>   </code><code>(</code><code>null</code><code>,5,</code><code>'山西'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1322222'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,6,</code><code>'河北'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1333333'</code><code>),</code>

<code>     </code><code>(</code><code>null</code><code>,8,</code><code>'广东'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'121121212'</code><code>),</code>

<code>    </code><code>(</code><code>null</code><code>,9,</code><code>'深证'</code><code>,</code><code>'[email protected]'</code><code>,</code><code>'1821212'</code><code>);</code>

ok,数据和表创建完了,下面讲如何用ThinkPHP的关联模型去获取表中数据

现在Model文件夹里创建UserModel.class.php

<code>&lt;?php</code>

<code>class</code> <code>UserModel extend RelationModel{}</code>

先做部门和员工之间的关系.员工表的did和部门表的id对应

<code>class</code> <code>UserModel </code><code>extends</code> <code>RelationModel{</code>

<code>    </code><code>protected</code> <code>$_link</code><code>=</code><code>array</code><code>(</code>

<code>            </code><code>'Department'</code><code>=&gt;</code><code>array</code><code>(</code>

<code>                    </code><code>'mapping_type'</code><code>=&gt;BELONGS_TO,</code>

<code>                    </code><code>'class_name'</code><code>=&gt;</code><code>'Department'</code><code>,</code>

<code>                    </code><code>'mapping_name'</code><code>=&gt;</code><code>'Department'</code><code>,</code>

<code>                    </code><code>'foreign_key'</code><code>=&gt;</code><code>'did'</code><code>,</code>

<code>                </code><code>),</code>

<code>        </code><code>);</code>

<code>}</code>

mapping_type是要关联的模型类名

mapping_name 关联表的模型名称

foreign_key   关联表的外键定义

mapping_fields    关联表要查询的字段,默认为全部字段

condition   关联条件

parent_key 自引用关联字段

as_fields   字段别名定义

2.员工表和档案表之间的关系

<code>protected</code> <code>$_link</code><code>=</code><code>array</code><code>(</code>

<code>        </code><code>'Archives'</code><code>=&gt;</code><code>array</code><code>(</code>

<code>                </code><code>'mapping_type'</code><code>=&gt;HAS_ONE,</code>

<code>                </code><code>'class_name'</code><code>=&gt;</code><code>'Archives'</code><code>,</code>

<code>                </code><code>'foreign_key'</code><code>=&gt;</code><code>'id'</code><code>,</code>

<code>                </code><code>'condition'</code><code>=&gt;</code><code>'uid'</code>

<code>            </code><code>),</code>

<code>    </code><code>);</code>

3.员工表与银行卡表之间关系的定义

<code>            </code><code>'Cars'</code><code>=&gt;</code><code>array</code><code>(</code>

<code>                    </code><code>'mapping_type'</code><code>=&gt;HAS_MANY,</code>

<code>                    </code><code>'class_name'</code><code>=&gt;</code><code>'Cars'</code><code>,</code>

<code>                    </code><code>'foreign_key'</code><code>=&gt;</code><code>'id'</code><code>,</code>

<code>                    </code><code>'condition'</code><code>=&gt;</code><code>'uid'</code><code>,</code>

使用方法,在IndexAction.class.php中

<code>class</code> <code>IndexAction </code><code>extends</code> <code>Action {</code>

<code>    </code><code>public</code> <code>function</code> <code>index(){</code>

<code>        </code><code>$user</code><code>=D(</code><code>'User'</code><code>);</code>

<code>        </code><code>$row</code><code>=</code><code>$user</code><code>-&gt;relation(true)-&gt;select();</code>

<code>        </code><code>dump(</code><code>$row</code><code>);</code>

<code>    </code><code>}</code>

本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1419856,如需转载请自行联系原作者