hasOne、hasMany、belongsTo


這里將hasOne、hasMany、belongsTo進行一個詳細舉例說明。

首先,這3個的大致中文意思:

hasOne:有一個,加上主謂語應該是 ,A 有一個 B hasMany:有很多,A 有很多 B belongsTo:屬於, A 屬於 B

這里我們准備3張表來理解他們的關系:
user_group 用戶分組表:id、title
user 用戶表:id、user_group_id、username、password
profile 用戶信息表:id、user_id、nickname、sex

1、user表需要關聯user_group表,表示每一個 用戶 需要知道該用戶是 哪個用戶分組的;
2、profile表 需要關聯 用戶表,表示該用戶信息數據 是哪個用戶的信息;

我們知道一個用戶組下面可以有很多用戶,所以:user_group hasMany user;
一個用戶 屬於 一個用戶組,所以:user belongsTo user_group;

同樣是user_group和user表,但我們出發點不同,關系也就不一樣了。

每個用戶都應該有唯一一條用戶信息數據,所以:user hasOne profile;
一條用戶信息 屬於 一個用戶,所以:profile belongsTo user

綜上:

在User模型中,我們可以定義關聯:
function user_group(){
    return $this->belongsTo('UserGroup');
}
function profile(){
   return $this->hasOne('Profile');
}

我們在查詢中:
$user = model('User')->find();
$user = $user->user_group; //這樣user中就可以包含當前數據對應的user_grou數據了
$user = $user->profile;//這樣user中就可以包含當前數據對應的profile數據了

在UserGroup模型中,我們可以定義關聯:
function user(){
   return $this->hasMany('User');
}

在Profile模型中,我們可以定義關聯:
function user(){
    return $this->belongsTo('User');
} 

注:定義關聯function的方法名可以隨意定義,一般為表名或模型名;
我們定義的時候是function,但獲取時理解為獲取屬性,所以不加(); 很多人理解是我定義了一個profile的方法,所以應該
$user->profile(),這里要特別注意下。 這樣我們在查詢時,就方便了,不需要使用大量的join。


免責聲明!

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



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