做項(xiàng)目時(shí)總時(shí)喜歡使用db函數(shù)快速操作數(shù)據(jù)庫娱颊,但是這樣子會(huì)導(dǎo)致一個(gè)控制器內(nèi)包含多至數(shù)據(jù)庫所有表的操作,第一不大美觀凯砍,第二不利于代碼的反復(fù)使用箱硕,違背了低耦合高內(nèi)聚(是不是這樣子?悟衩?剧罩?)的原則!座泳!
所以我決定又撿起了許久沒啃的model關(guān)聯(lián)
不逼一下自己怎么能知道放棄是多么舒服呢惠昔!
不對(duì)幕与。。舰罚。纽门。怎么能知道關(guān)聯(lián)是多么好用呢
- 首先,學(xué)習(xí)關(guān)聯(lián)能讓自己對(duì)tp多一份熟悉
- 第二营罢,減少了控制器中對(duì)數(shù)據(jù)庫的操作赏陵,轉(zhuǎn)為通過model層對(duì)數(shù)據(jù)庫操作,符合MVC思想
- 第三饲漾,沒有第三蝙搔,開始記錄吧。考传。吃型。
以下是本人對(duì)tp5文檔的理解總結(jié),絕非照搬照抄
一對(duì)一關(guān)聯(lián)
何為一對(duì)一僚楞?舉個(gè)栗子
有個(gè)用戶表user勤晚,里面一用戶張三
id: 1
nickname: 張三
create_time: 2021-02-08
有個(gè)用戶料表profile,有且只有張三的一條用戶資料泉褐,修改也只是在這條數(shù)據(jù)上修改
id: 1,
user_id: 1,
mobile: 13345601201,
avatar: '/imgs/user/avatar.png'
so赐写,就可以在model中操作了
- 創(chuàng)建model
php think make:model user
php think make:model profile
生成對(duì)應(yīng)model
在模型user中,設(shè)置對(duì)應(yīng)資料的關(guān)聯(lián)關(guān)系膜赃,因?yàn)槭且粚?duì)一關(guān)系挺邀,所以用hasOne來關(guān)聯(lián),然后在模型profile中設(shè)置相對(duì)關(guān)聯(lián)
User.php
public function profile() {
return $this->hasOne('Profile');
默認(rèn)關(guān)聯(lián)id為對(duì)應(yīng)model的名稱跳座,例當(dāng)前profile對(duì)應(yīng)外鍵為user_id端铛,若不為默認(rèn)外鍵,則在第二個(gè)參數(shù)中指定
return $this->hasOne('Profile', 'member_id');
}
Profile.php
public function user() {
return $this->belongsTo('Profile');
規(guī)則同上
}
在隨便一個(gè)不知名的控制器中敲入
use app\model\User;
$user = User::get(1);
或者使用預(yù)載入的方式
$user = User::with('profile')->select([1]);
dump($user->profile);
就能打印出profile中對(duì)應(yīng)張三的資料了
- 對(duì)對(duì)應(yīng)關(guān)聯(lián)模型的數(shù)據(jù)操作
$user = User::get(1);
修改
$user->profile->mobile = 13333333333;
$user->profile->save();
新增
$user->profile->save(['mobile' => 13333333333]);
那有個(gè)問題疲眷,如果一對(duì)一關(guān)聯(lián)使用到多個(gè)的數(shù)據(jù)類型上會(huì)怎樣禾蚕?(不是我杠精,要秉承科學(xué)嚴(yán)謹(jǐn)?shù)膽B(tài)度)例如
一個(gè)用戶可以有多個(gè)地址狂丝,那會(huì)打印出什么夕膀?我試了一下
他會(huì)打印出最新的一條,不是按id來排列