模型hasOne、hasMany、belongsTo詳解

ThinkPHP5有關(guān)聯(lián)模型的操作,但有部分初學(xué)者對數(shù)據(jù)表中常見的幾種表與表的關(guān)系還存在著問題,所以使用不好關(guān)聯(lián)查詢。

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

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

hasOne:有一個,加上主謂語應(yīng)該是 ,A 有一個 B
hasMany:有很多,A 有很多 B
belongsTo:屬于, A 屬于 B

這里我們準(zhǔn)備3張表來理解他們的關(guān)系:
user_group 用戶分組表:id、title
user 用戶表:id、user_group_id、username、password
profile 用戶信息表:id、user_id、nickname、sex

1、user表需要關(guān)聯(lián)user_group表,表示每一個 用戶 需要知道該用戶是 哪個用戶分組的;
2、profile表 需要關(guān)聯(lián) 用戶表,表示該用戶信息數(shù)據(jù) 是哪個用戶的信息;

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

同樣是user_group和user表,但我們出發(fā)點不同,關(guān)系也就不一樣了。

每個用戶都應(yīng)該有唯一一條用戶信息數(shù)據(jù),所以:user hasOne profile;
一條用戶信息 屬于 一個用戶,所以:profile belongsTo user

綜上:

在User模型中,我們可以定義關(guān)聯(lián):

function user_group(){
    return $this->belongsTo('UserGroup');
}
function profile(){
   return $this->hasOne('Profile');
}

在UserGroup模型中,我們可以定義關(guān)聯(lián):

function user(){
   return $this->hasMany('User');
}

在Profile模型中,我們可以定義關(guān)聯(lián):

function user(){
    return $this->belongsTo('User');
} 

注:定義關(guān)聯(lián)function的方法名可以隨意定義,一般為表名或模型名;我們定義的時候是function,但獲取時理解為獲取屬性,所以不加();
很多人理解是我定義了一個profile的方法,所以應(yīng)該$user->profile(),這里要特別注意下。

這樣我們在查詢時,就方便了,不需要使用大量的join。

/***************/
在使用的時候需要先在要關(guān)聯(lián)的主表模型定義一個方法,這個方法會將表2的id關(guān)聯(lián)模型的id,并定義要返回的字段(id必須作為返回項)

public function Prov()
    {
        return $this->hasOne(表2,表2的關(guān)聯(lián)字段, 模型的關(guān)聯(lián)字段)->field('表2的id,表2的name');
    }

定義完成后將定義的方法用with預(yù)加載進list方法內(nèi),這樣在控制器內(nèi)使用這個模型的lists方法時會自動將模型和表2進行關(guān)聯(lián)查詢,完成后返回關(guān)聯(lián)查詢的結(jié)果

public function lists($where, $page, $listRow)
    {
        $lists = $this
            ->with('prov')
            ->where($where)
            ->page($page, $listRow)
            ->select();
        if (!empty($lists))
        {
            return $lists->toArray();
        } else
        {
            return [];
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容