# 關系型 Active Record #
https://www.yiichina.com/doc/guide/1.1/database.arr
BELONGS_TO(屬于): 如果表 A 和 B 之間的關系是一對多,則 表 B 屬于 表 A (例如 Post 屬于 User);
HAS_MANY(有多個): 如果表 A 和 B 之間的關系是一對多,則 A 有多個 B (例如 User 有多個 Post);
HAS_ONE(有一個): 這是 HAS_MANY 的一個特例,A 最多有一個 B (例如 User 最多有一個 Profile);
MANY_MANY: 這個對應于數據庫中的 多對多 關系。 由于多數 DBMS 不直接支持 多對多 關系,因此需要有一個關聯表將 多對多 關系分割為 一對多 關系。 在我們的示例數據結構中,tbl_post_category 就是用于此目的的。在 AR 術語中,我們可以解釋 MANY_MANY 為 BELONGS_TO 和 HAS_MANY 的組合。 例如,Post 屬于多個(belongs to many) Category ,Category 有多個(has many) Post.
## 項目示例
D:\wamp\www\weike.test\weiketest\protected\models\weike\wkeTeachingV3.php
```
public function tableName()
{
return WK::DBweike.'.tbTeachingV3';
}
public function relations()
{
return array(
'prepare' => array(self::BELONGS_TO, 'wkePrepare', 'fdPrepareID'),
'class'=>array(self::BELONGS_TO,'wkeClass','fdClassID') ,//by liupf 2016/7/9
'record'=>array(self::HAS_MANY,'wkeTeachingV3Student','fdTeachingV3ID'),//by liupf 2016/9/28
'content'=>array(self::BELONGS_TO,'Content','fdPrepareID'),//by liupf 2016/9/28
'user'=>array(self::BELONGS_TO,'User','fdTeacherID'),//by liupf 2016/10/19
'operations' => array(self::HAS_MANY,'wkeTeachingV3Operation','fdTeachingV3ID') ,
'schoolMap'=>array(self::HAS_ONE,'SchoolMap','','on'=>'t.fdTeacherID = schoolMap.fdUserID'),
);
}
```
D:\wamp\www\weike.test\weiketest\protected\models\weike\wkePrepare.php
```
public function tableName()
{
return WK::DBweike . '.tbPrepare';
}
public function relations()
{
return array(
'user' => array(self::BELONGS_TO, 'User', 'fdTeacherID'),
'prepareItems' => array(self::HAS_MANY, 'wkePrepareItem', 'fdPrepareID'),
'itemCnts' => array(self::HAS_MANY, 'wkePrepareItemContent',array('id'=>'fdPrepareItemID'),'through'=>'prepareItems'),
'bookTag' => array(self::BELONGS_TO, 'Tag', 'fdTextbookID'),
'tag' => array(self::BELONGS_TO, 'Tag', 'fdTagID'),
'content' => array(self::BELONGS_TO, 'Content', 'fdContentID'),
'cntPreHw' => array(self::STAT, 'wkeAssignment', 'fdPrepareID',
'condition' => 't.fdType=' . WK::PREPARE_ITEM_TYPE_PREVIEW),
'cntAssHw' => array(self::STAT, 'wkeAssignment', 'fdPrepareID',
'condition' => 't.fdType=' . WK::PREPARE_ITEM_TYPE_ASSIGNMENT),
'cntTch' => array(self::STAT, 'wkeInClass', 'fdPrepareID'),
'groupMap' => array(self::HAS_MANY, 'wkePrepareGroupMap', 'fdPrepareID'),
'boards' => array(self::HAS_MANY, 'wkePrepareBoard', 'fdPrepareID'),
'ctnTagIndex' => array(self::HAS_MANY, 'wkeCtnTagIndex', '', 'on' => 't.fdContentID=ctnTagIndex.fdContentID'),
);
}
```
## 多對多關聯模型
**D:\wamp\www\xue.test\xuetang\protected\models\service\User.php**
```
public function relations(){
'usercourse' => array(self::MANY_MANY, 'xtCourse', 'wkxuetang.tbCourseStudent(fdUserID, fdCourseID)'),
}
```
**D:\wamp\www\xue.test\xuetang\protected\modules\courseCenter\controllers\StuCourseController.php**
```
/**
* 獲取當前用戶的課程
*/
public function actionGetMyCourse()
{
$userId = RequestUtils::getNormalRequest('userId'); //19
if (!$userId) {
ResponseUtils::json(null, 1, 'fail');
}
$criteria = new CDbCriteria();
$criteria->with = ['usercourse'];
$criteria->addCondition("t.id=" . $userId);
$list = User::model()->findAll($criteria);
if ($list) {
ResponseUtils::json($list);
}
ResponseUtils::json(null, 1, 'fail');
}
```
### SQL
```
SELECT
`t`.`id` AS `t0_c0`,
`t`.`fdNumber` AS `t0_c1`,
`t`.`fdLogin` AS `t0_c2`,
`t`.`fdName` AS `t0_c3`,
`t`.`fdRealName` AS `t0_c4`,
`t`.`fdPassword` AS `t0_c5`,
`t`.`fdActive` AS `t0_c6`,
`t`.`fdQuestion` AS `t0_c7`,
`t`.`fdAnswer` AS `t0_c8`,
`t`.`fdPortrait` AS `t0_c9`,
`t`.`fdGender` AS `t0_c10`,
`t`.`fdApprove` AS `t0_c11`,
`t`.`fdApproverID` AS `t0_c12`,
`t`.`fdCreate` AS `t0_c13`,
`t`.`fdStatus` AS `t0_c14`,
`t`.`fdTypeID` AS `t0_c15`,
`t`.`fdCardID` AS `t0_c16`,
`t`.`fdPoints` AS `t0_c17`,
`t`.`fdMoney` AS `t0_c18`,
`t`.`fdCash` AS `t0_c19`,
`t`.`fdDisabled` AS `t0_c20`,
`t`.`fdShutup` AS `t0_c21`,
`t`.`fdExpired` AS `t0_c22`,
`t`.`fdRgType` AS `t0_c23`,
`t`.`fdVipType` AS `t0_c24`,
`t`.`fdOutsideUID` AS `t0_c25`,
`t`.`fdOutsideHost` AS `t0_c26`,
`t`.`fdIsXuetang` AS `t0_c27`,
`t`.`fdTeacherID` AS `t0_c28`,
`t`.`fdParentID` AS `t0_c29`,
`t`.`fdTeamType` AS `t0_c30`,
`t`.`fdOutsideUUID` AS `t0_c31`,
`usercourse`.`id` AS `t1_c0`,
`usercourse`.`fdUserID` AS `t1_c1`,
`usercourse`.`fdName` AS `t1_c2`,
`usercourse`.`fdCourseType` AS `t1_c3`,
`usercourse`.`fdSubjectID` AS `t1_c4`,
`usercourse`.`fdSchoolTypeID` AS `t1_c5`,
`usercourse`.`fdViewType` AS `t1_c6`,
`usercourse`.`fdDiff` AS `t1_c7`,
`usercourse`.`fdFee` AS `t1_c8`,
`usercourse`.`fdThumb` AS `t1_c9`,
`usercourse`.`fdVideo` AS `t1_c10`,
`usercourse`.`fdVideoThumb` AS `t1_c11`,
`usercourse`.`fdInfo` AS `t1_c12`,
`usercourse`.`fdStatus` AS `t1_c13`,
`usercourse`.`fdCreate` AS `t1_c14`,
`usercourse`.`fdUpdate` AS `t1_c15`
FROM
`wksvc`.`tbUser` `t`
LEFT OUTER JOIN `wkxuetang`.`tbCourseStudent` `usercourse_usercourse` ON (
`t`.`id` = `usercourse_usercourse`.`fdUserID`
)
LEFT OUTER JOIN `wkxuetang`.`tbCourse` `usercourse` ON (
`usercourse`.`id` = `usercourse_usercourse`.`fdCourseID`
)
WHERE
(t.id = 19)
```
### 圖示


- 說明
- 開發任務
- 星課-真光
- 課表
- Excel Down
- 調課
- 課表修改
- 課表代碼分析
- 課堂
- 課堂:應用商店通信管理協議
- 教師賬號強制綁定手機或郵箱
- 強制綁定手機和修改密碼的規則
- 學堂
- 課程學習:討論功能
- 后臺:課程討論管理
- 課程直播接口
- 學習統計功能(舊版)
- 學習統計功能(新版)
- 同步課程統計功能
- 同步課程編輯-新增視頻
- 第三方接口
- 學科網
- 安徽第三方
- 大賽
- 管控系統
- 日志管理
- 設備日志
- 平板接口
- 渝教
- 教學總結
- 空白目錄
- Yii 1.1
- 學堂架構
- Yii 1.1一些方法的解讀
- MVCS結構
- 基礎使用語法
- 創建1個新模塊
- 關聯模型
- CDbCriteria
- 學生-課堂記錄
- 學生端頁面展示
- 教師端頁面展示
- 編輯課程文檔
- SQL
- 課堂項目運行入口
- 上傳資源示意圖
- 行為
- PHPStorm
- 源碼閱讀
- 會診答卷頁面
- 考點練習
- 資源首頁
- 同步課程
- 同步課程:章節信息
- 升學復習
- 統計圖-范例
- 模塊
- 非法詞
- 服務層
- MongoDB類
- 學堂作答記錄從Mongo新集合獲取數據
- MongoYii
- 錯題集
- 小技巧
- 完善資料
- 郵件發送
- K12
- JSpang視頻課程
- MongoDB
- 創業
- 項目
- 包包