做項目時總時喜歡使用db函數快速操作數據庫,但是這樣子會導致一個控制器內包含多至數據庫所有表的操作,第一不大美觀,第二不利于代碼的反復使用,違背了低耦合高內聚(是不是這樣子???)的原則??!
所以我決定又撿起了許久沒啃的model關聯(lián)
不逼一下自己怎么能知道放棄是多么舒服呢!
不對。。。。怎么能知道關聯(lián)是多么好用呢
- 首先,學習關聯(lián)能讓自己對tp多一份熟悉
- 第二,減少了控制器中對數據庫的操作,轉為通過model層對數據庫操作,符合MVC思想
- 第三,沒有第三,開始記錄吧。。。
以下是本人對tp5文檔的理解總結,絕非照搬照抄
一對一關聯(lián)
何為一對一?舉個栗子
有個用戶表user,里面一用戶張三
id: 1
nickname: 張三
create_time: 2021-02-08
有個用戶料表profile,有且只有張三的一條用戶資料,修改也只是在這條數據上修改
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
生成對應model
在模型user中,設置對應資料的關聯(lián)關系,因為是一對一關系,所以用hasOne來關聯(lián),然后在模型profile中設置相對關聯(lián)
User.php
public function profile() {
return $this->hasOne('Profile');
默認關聯(lián)id為對應model的名稱,例當前profile對應外鍵為user_id,若不為默認外鍵,則在第二個參數中指定
return $this->hasOne('Profile', 'member_id');
}
Profile.php
public function user() {
return $this->belongsTo('Profile');
規(guī)則同上
}
在隨便一個不知名的控制器中敲入
use app\model\User;
$user = User::get(1);
或者使用預載入的方式
$user = User::with('profile')->select([1]);
dump($user->profile);
就能打印出profile中對應張三的資料了
- 對對應關聯(lián)模型的數據操作
$user = User::get(1);
修改
$user->profile->mobile = 13333333333;
$user->profile->save();
新增
$user->profile->save(['mobile' => 13333333333]);
那有個問題,如果一對一關聯(lián)使用到多個的數據類型上會怎樣?(不是我杠精,要秉承科學嚴謹的態(tài)度)例如
一個用戶可以有多個地址,那會打印出什么?我試了一下
他會打印出最新的一條,不是按id來排列