引言
本期我們把目光投向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 :-)