ThinkPHP關聯模型詳解


 在ThinkPHP中,關聯模型更類似一種mysql中的外鍵約束,但是外鍵約束更加安全,缺點卻是在寫sql語句的時候不方便,ThinkPHP很好得解決了這個問題.但是很多人不動關聯模型的意思.現在就寫個例子.讓大家理解ThinkPHP關聯模型的意思.

        環境描述:公司有一個員工表think_user,一個檔案表,think_archives,一個部門表,think_department,和一個銀行卡表.think_cars.

        一個員工只有一個檔案表,所以關系就是HSA_ONE,

        一個員工只屬於一個部門,但是部門里有多個員工,所以是BELONGS_TO關系

        一個員工有多個銀行卡,但是一個銀行卡只能屬於一個員工.所以關系就是HAS_MANY.

        先創建需要的表和測試數據

       think_user員工表

CREATE TABLE `think_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `did` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

    think_department部門表

 CREATE TABLE `think_department` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

        think_archives檔案表

CREATE TABLE `think_archives` ( `id` int(7) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `addr` varchar(200) DEFAULT NULL, `email` varchar(30) DEFAULT NULL, `tel` int(13) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

think_cars銀行卡表

CREATE TABLE `think_cars` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, `type` varchar(50) DEFAULT NULL, `uid` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

插入數據到部門表think_department

insert into think_cars values (null,'gongxiang','工商卡','1'), (null,'jianshe','建行卡','2'), (null,'jiaohang','交通銀行卡',3);

think_user數據

insert into think_archives values (null,1,'北京','123@163.com','13888888'), (null,2,'上海','111@qq.com','1377777'), (null,3,'重慶','222@qq.com','1344444'), (null,4,'天津','333@qq.com','1111111'), (null,5,'山西','444@qq.com','1322222'), (null,6,'河北','555@qq.com','1333333'), (null,7,'廣州','6666@qq.com','13232323'), (null,8,'廣東','7777@qq.com','121121212'), (null,9,'深證','888@qq.com','1821212');

think_cars數據

insert into think_cars values (null,'gongxiang','工商卡','1'), (null,'jianshe','建行卡','2'), (null,'jiaohang','交通銀行卡',3); Query OK, 3 rows affected (0.01 sec)

think_archives

insert into think_archives values (null,1,'北京','123@163.com','13888888'), (null,2,'上海','111@qq.com','1377777'), (null,3,'重慶','222@qq.com','1344444'), (null,4,'天津','333@qq.com','1111111'), (null,5,'山西','444@qq.com','1322222'), (null,6,'河北','555@qq.com','1333333'), (null,7,'廣州','6666@qq.com','13232323'), (null,8,'廣東','7777@qq.com','121121212'), (null,9,'深證','888@qq.com','1821212');

ok,數據和表創建完了,下面講如何用ThinkPHP的關聯模型去獲取表中數據

現在Model文件夾里創建UserModel.class.php

<?php class UserModel extend RelationModel{}
  1. 先做部門和員工之間的關系.員工表的did和部門表的id對應

class UserModel extends RelationModel{ protected $_link=array( 'Department'=>array( 'mapping_type'=>BELONGS_TO, 'class_name'=>'Department', 'mapping_name'=>'Department', 'foreign_key'=>'did', ), ); }

mapping_type是要關聯的模型類名

mapping_name 關聯表的模型名稱

foreign_key   關聯表的外鍵定義

mapping_fields    關聯表要查詢的字段,默認為全部字段

condition   關聯條件

parent_key 自引用關聯字段

as_fields   字段別名定義

2.員工表和檔案表之間的關系

protected $_link=array( 'Archives'=>array( 'mapping_type'=>HAS_ONE, 'class_name'=>'Archives', 'foreign_key'=>'id', 'condition'=>'uid' ), );

3.員工表與銀行卡表之間關系的定義

protected $_link=array( 'Cars'=>array( 'mapping_type'=>HAS_MANY, 'class_name'=>'Cars', 'foreign_key'=>'id', 'condition'=>'uid', ), );

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

class IndexAction extends Action { public function index(){ $user=D('User'); $row=$user->relation(true)->select(); dump($row); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM