文章出處

一. 模型簡介
關聯模型,一共有三種模式。一對一:ONE_TO_ONE,包括 HAS_ONE 和 BELONGS_TO;
一對多:ONE_TO_MANY,包括 HAS_MANY 和 BELONGS_TO;多對多:MANY_TO_MANY。
          用表關系來理解這三種模式:
一對一:用戶表和身份證表,一個用戶只能對應一個身份證,而一個身份證只能對應一
          個用戶。這就是一對一。
一對多:用戶表和留言表:一個用戶可以發表 N 條留言,而每條留言只能由某一個用戶
          發表。這就是一對多。就算有多個用戶發表了相同的留言內容,但 ID 卻不一樣,所以,不
          能理解為多對多。
多對多:用戶表和角色表:一個用戶可以是認證專員,同時也是審核專員。那么角色表
          中的審核專員也可以是蠟筆小新的角色,也可以是路飛的角色。這就是多對多。

二. 關聯操作

用戶表和身份證表關聯,HAS_ONE(一對一),表示一個用戶只有一個身份證。

先創建兩個數據表:

 think_card 

 think_user 

 

 WeiBo/Home/Controller/UserController.class.php 中插入代碼:

 1 <?php
 2 
 3 namespace Home\Controller;
 4 use Think\Controller;
 5 use Home\Model\UserModel;
 6 
 7 class UserController extends Controller {
 8     public function index() {        
 9         $user = D('User');
10         $arr = $user->relation(true)->select();
11         var_dump($arr);
12     }
13  }

然后在 WeiBo/Home/User/Model/UserModel.class.php 中插入代碼:

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model;
 4 use Think\Model\RelationModel;
 5 
 6 class UserModel extends RelationModel {
 7     protected $_link = array(
 8         'Card'=>array(
 9             'mapping_type'=>self::HAS_ONE,
10             'class_name'=>'Card',
11             'mapping_name'=>'Card',
12             'foreign_key' =>'uid',
13             'mapping_fields'=>'code',
14             'as_fields'=>'code',
15             'condition'=>'id=1',
16             ),
17         );    
18 }

HAS_ONE 支持以下屬性

class_name  關聯的模型類名,如果不寫,會自動定位相關數據表。
mapping_name 關聯映射名稱,用于獲取數據的數組名。
mapping_type 設置關聯模式,比如一對一 self::HAS_ONE。
foreign_key  關聯外鍵的名稱,會自動對應當前數據表的 id。
mapping_fields  關聯要查詢的字段,默認是查詢所有。
as_fields  關聯的字段映射成同級的字段。
condition 關聯條件,額外查詢使用。

在 WeiBo/Home/User/Model/UserModel.class.php 中測試各行代碼的效果:

1 protected $_link = array(
2         'Card'=>array(
3             'mapping_type'=>self::HAS_ONE,
4             'class_name'=>'Card',
5             'mapping_name'=>'Carder',
6             ),
7         );    

效果為:

 'class_name'=>'Card', 這行可以不寫,因為不寫的的時候默認會自動定位相關數據表,

但寫了就不能寫錯了,必須和數據表的名字是一樣的。

 'mapping_name'=>'Carder', 則這時把定位的數據表的名字改為 Carder ,這時什么都沒顯示,

是因為沒有設置關聯的外鍵,加上 'foreign_key' =>'uid', 后,得到效果如圖:

這時就可以得到think_card和think_user的數據表關聯在一起了。

 

加上 'mapping_fields'=>'code', 后,只獲取think_card中的code數據;

再加上 'as_fields'=>'code', 后,則將think_card中的code數據呈現形式和think_user中的數據呈現形式一樣:

 

加上 'condition'=>'id=1', 后,獲取 think_card 中只獲取 id=1 的數據,只是SQL查詢的方式有些變化

沒加之前是:

加了之后:

這時讀取數據中只有id=1的數據中有code,其它的code的數據都是NULL,

 

 

下面是BELONGS_TO關聯模型:

Belongs_to 關聯表示當前模型從屬于另外一個父對象,例如每個用戶都屬于一個部門

新建 WeiBo/Home/Controller/CardController.class.php ,代碼為:

 1 <?php
 2 namespace Home\COntroller;
 3 use Think\Controller;
 4 
 5 class CardController extends Controller {
 6     public function index() {
 7         $card = D('Card');
 8         $arr=$card->relation(true)->select();
 9         var_dump($arr);
10     }
11 }

新建 WeiBo/Home/User/Model/CardModel.class.php ,插入代碼:

 1 <?php
 2 namespace Home\Model;
 3 use Think\Model;
 4 use Think\Model\RelationModel;
 5 
 6 class CardModel extends RelationModel {
 7     protected $_link = array(
 8       'User'=>array(
 9          'mapping_type'=>self::BELONGS_TO,
10          'foreign_key'=>'uid',
11          'mapping_fields'=>'user',
12          'as_fields'=>'user',
13           ),
14     );
15 
16 }

 'foreign_key'=>'uid', 中關聯的uid是card表中的結構,而不是user表中的結構。card中的uid的數據為:1,2,4,則得到的結果是:

紅色標出的是需要注意的部分,如果這里寫id,在card表中的數據為1,2,3則出現的結果為:

此時得到的數據是user里面的第3個用戶的名字。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()