首頁>技術>

引言

本期我們把目光投向laravel模型的關聯關係上。框架提供的關聯關係,有很多種,其中對於一對一的關係, 有兩個寫法,一個是 belongsTo,一個是 hasOne,這倆到底啥區別,本文就來說一說。

學習時間

從文件上講,belongsTo 是 hasOne 的逆函式。拿User表作為示例,比如一個使用者,只有一個手機號, 首先使用 hasOne 方式定義關聯:

class User extends Model{ /** * 獲取與user對應的phone記錄 */ public function phone() { return $this->hasOne('App\\Phone'); }}

使用上述的 hasOne 方法,可以使用 $user->phone 返回一個 Phone 模型物件,但是反過來不行, 你不能通過 Phone 獲取 User,也就是 $phone->user,這是做不到的。

要達到這個目的,你需要在 Phone 模型中,相應地定義 Phone 到 User 的對應關係,如下:

class Phone extends Model{ /** * 通過 phone 查詢對應 user */ public function user() { return $this->belongsTo('App\\User'); }}

雖然這樣寫了,大家也許還看的迷迷糊糊。因為關聯關係的第二個,第三個引數,根本沒有填寫。 所以這樣對比是不直觀的。

hasOne 和 belongsTo 最大的不同,是哪一方持有關係的外來鍵。

舉個例子,比如User表,還有一個 Car表,為了簡化邏輯關係, 我們假設一個user只有一個car。我們在car表內設計一個 user_id 欄位,用於儲存 user 表的 id 值。 那麼模型設計起來就應該是這樣的:

class User extends Model { public function car()  { // $user->car 返回一個 Car 模型物件 return $this->hasOne('Car'); }}

然後就是 Car 到 User 的反關係,外來鍵為 user_id,定義關聯關係:

class Car extends Model { public function user()  { // car 表有一個 user_id 欄位 return $this->belongsTo('User', 'user_id', 'id');  }}

再說一個一對多的關係示例,比如說一個使用者有多個手機號,那麼使用 hasMany 關聯模型:

class User extends Model { public function phones()  { // $user->phones 會返回一個 Phone 模型的集合 return $this->hasMany('Phone'); }}

那麼反過來,我們在 phone 表內使用 user_id 儲存使用者的id,定義反向關係,這樣寫:

class Phone extends Model { public function owner()  { return $this->belongsTo('User', 'user_id', 'id');  }}

所以,反向關係無關於原始的一對一,或者一對多,因為資料庫表記憶體儲了外來鍵,所以使用這個belongsTo對應回去。

寫在最後

本文通過幾個例項介紹了資料庫模型的一對一,一對多,以及反向關聯關係, 大家記住一點,belongsTo 是根據當前表儲存的外來鍵,去主表內查詢記錄,而且是返回一個模型物件,或者null。 至於 hasOne hasMany 則是定義的主表的關係。 大家多多練習體會一下。

Happy coding :-)

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 今天我使用uni-ap建立了一個雲服務空間,用雲服務寫專案