一. 模型簡介
關聯模型,一共有三種模式。一對一: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個用戶的名字。
文章列表