国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

深入理解 Laravel Eloquent(三)——模型間關系(關聯)

2501207950 / 2828人閱讀

摘要:是什么是一個,全稱為,翻譯為對象關系映射如果只把它當成數組庫抽象層那就太小看它了。所謂對象,就是本文所說的模型對象關系映射,即為模型間關系。至此,深入理解系列文章到此結束。

  

原文發表在我的個人網站:深入理解 Laravel Eloquent(三)——模型間關系(關聯)

在本篇文章中,我將跟大家一起學習 Eloquent 中最復雜也是最難理解的部分——模型間關系。官方英文文檔中叫 Relationships,個人認為翻譯成 “模型間關系” 比現在的 “關聯” 更好理解一點哈哈。

Eloquent是什么

Eloquent 是一個 ORM,全稱為 Object Relational Mapping,翻譯為 “對象關系映射”(如果只把它當成 Database Abstraction Layer 數組庫抽象層那就太小看它了)。所謂 “對象”,就是本文所說的 “模型(Model)”;對象關系映射,即為模型間關系。中文文檔: http://laravel-china.org/docs/eloquent#relationships

下面我們開始一個一個地學習。

一對一關系

顧名思義,這描述的是兩個模型之間一對一的關系。這種關系是不需要中間表的。

假如我們有兩個模型:User 和 Account,分別對應注冊用戶和消費者,他們是一對一的關系,那么如果我們要使用 Eloquent 提供的一對一關系方法,表結構應該是這樣的:

rubyuser: id ... ... account_id
account: id ... ... user_id

假設我們需要在 User 模型中查詢對應的 Account 表的信息,那么代碼應該是這樣的。 /app/models/User.php:

phphasOne("Account", "user_id", "id");
  }
}

然后,當我們需要用到這種關系的時候,該如何使用呢?如下:

php$account = User::find(10)->hasOneAccount;

此時得到的 $account 即為 Account 類的一個實例。


這里最難的地方在于后面的兩個 foreign_key 和 local_key 的設置,大家可以就此記住:在 User 類中,無論 hasOne 誰,第二個參數都是 user_id,第三個參數一般都是 id。由于前面的 find(10) 已經鎖定了 id = 10,所以這段函數對應的 SQL 為: select * from account where user_id=10


這段代碼除了展示了一對一關系該如何使用之外,還傳達了三點信息,也是我對于大家使用 Eloquent 時候的建議:

  

每一個 Model 中都指定表名

has one account 這樣的關系寫成 hasOneAccount() 而不是簡單的 account()

每次使用模型間關系的時候都寫全參數,不要省略

相應的,如果使用 belongsTo() 關系,應該這么寫:

phpbelongsTo("User", "user_id", "id");
  }
}
一對多關系

學會了前面使用一對一關系的基礎方法,后面的幾種關系就簡單多了。

我們引入一個新的Model:Pay,付款記錄。表結構應該是這樣的:

rubyuser: id ... ...
pay: id ... ... user_id

User 和 Pay 具有一對多關系,換句話說就是一個 User 可以有多個 Pay,這樣的話,只在 Pay 表中存在一個 user_id 字段即可。 /app/models/User.php:

phphasMany("Pay", "user_id", "id");
  }
}

然后,當我們需要用到這種關系的時候,該如何使用呢?如下:

php$accounts = User::find(10)->hasManyPays()->get();

此時得到的 $accounts 即為 IlluminateDatabaseEloquentCollection 類的一個實例。大家應該也已經注意到了,這里不是簡單的 -> hasOneAccount 而是 ->hasManyPays()->get(),為什么呢?因為這里是 hasMany,操作的是一個對象集合。

相應的 belongsTo() 的用法跟上面一對一關系一樣:

phpbelongsTo("User", "user_id", "id");
  }
}
多對多關系

多對多關系和之前的關系完全不一樣,因為多對多關系可能出現很多冗余數據,用之前自帶的表存不下了。

我們定義兩個模型:Article 和 Tag,分別表示文章和標簽,他們是多對多的關系。表結構應該是這樣的:

rubyarticle: id ... ...
tag: id ... ...
article_tag: article_id tag_id

在 Model 中使用:

phpbelongsToMany("Article", "article_tag", "tag_id", "article_id");
  }
}

需要注意的是,第三個參數是本類的 id,第四個參數是第一個參數那個類的 id。

使用跟 hasMany 一樣:

php$tagsWithArticles = Tag::take(10)->get()->belongsToManyArticle()->get();

這里會得到一個非常復雜的對象,可以自行 var_dump()。跟大家說一個訣竅,var_dump() 以后,用 Chrome 右鍵 “查看源代碼”,就可以看到非常整齊的對象/數組展開了。

  

在這里給大家展示一個少見用法(奇技淫巧):

phppublic function parent_video()
{
    return $this->belongsToMany($this, "video_hierarchy", "video_id", "video_parent_id");
}
public function children_video()
{
    return $this->belongsToMany($this, "video_hierarchy", "video_parent_id", "video_id");
}

對,你沒有看錯,可以 belongsToMany 自己。

其他關系

Eloquent 還提供 “遠層一對多關聯”、“多態關聯” 和 “多態的多對多關聯” 這另外三種用法,經過上面的學習,我們已經掌握了 Eloquent 模型間關系的基本概念和使用方法,剩下的幾種不常用的方法就留到我們用到的時候再自己探索吧。

重要技巧:關系預載入

你也許已經發現了,在一對一關系中,如果我們需要一次性查詢出10個 User 并帶上對應的 Account 的話,那么就需要給數據庫打 1 + 10 條 SQL,這樣性能是很差的。我們可以使用一個重要的特性,關系預載入:http://laravel-china.org/docs/eloquent#eager-loading

直接上代碼:

php$users = User::with("hasOneAccount")->take(10)->get()

這樣生成的 SQL 就是這個樣子的:

sqlselect * from account where id in (1, 2, 3, ... ...)

這樣 1 + 10 條 SQL 就變成了 1 + 1 條,性能大增。



至此,深入理解 Laravel Eloquent 系列文章到此結束。推薦繼續了解 軟刪除 、轉換成數組/JSON。

END

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20903.html

相關文章

  • 深入理解 Laravel Eloquent(二)——中操作流(Builder)

    摘要:原文發表在我的個人網站深入理解二中間操作流本篇教程是該系列教材的第二篇,將主要講述中中間操作流的概念。復雜用法示例下一步深入理解三模型間關系關聯 原文發表在我的個人網站:深入理解 Laravel Eloquent(二)——中間操作流(Builder) 本篇教程是該系列教材的第二篇,將主要講述 Eloquent 中中間操作流的概念。中間操作流是我自己總結并翻譯的概念,支撐該功能的類...

    yy736044583 評論0 收藏0
  • Laravel 的 ORM 返回的數據類型小結

    摘要:一簡介的數據庫查詢構造器提供了一個方便流暢的接口,用來創建及運行數據庫查詢語句。的查詢構造器使用參數綁定,來保護你的應用程序免受注入的攻擊。和返回的是影響行數,即失敗為,成功為刪除行數。 相信很多人在學習 Laravel 時,會對 ORM 返回的數據類型產生混淆,如返回集合,模或者整數類型,下面將對增刪改查操作進行一個小結。 一、簡介 Laravel 的數據庫查詢構造器提供了一個方便、...

    LeviDing 評論0 收藏0
  • Laravel核心解讀--Database(四) 模型關聯

    摘要:為關聯關系設置約束子模型的等于父模型的上面設置的字段的值子類實現這個抽象方法通過上面代碼看到創建實例時主要是做了一些配置相關的操作,設置了子模型父模型兩個模型的關聯字段和關聯的約束。不過當查詢父模型時,可以預加載關聯數據。 Database 模型關聯 上篇文章我們主要講了Eloquent Model關于基礎的CRUD方法的實現,Eloquent Model中除了基礎的CRUD外還有一個...

    gekylin 評論0 收藏0
  • Laravel學習筆記七-創建博客

    摘要:本節將使用用戶創建博文來學習數據模型關聯的有關知識。我們發現為我們生成的時間是英文的,如果要使用中文時間,則需要對進行本地化設置。動態屬性讓你能夠訪問關聯函數,就像他們是在模型中定義的屬性會假設對應關聯的外鍵名稱是基于模型名稱的。 本節將使用用戶創建博文來學習數據模型關聯的有關知識。 一、Laravel常用知識總結 1.提示信息漢化 如果用Laravel原生的表單提示錯誤信息,則是英文...

    icyfire 評論0 收藏0
  • 20 個 Laravel Eloquent 必備的實用技巧

    摘要:看起來是一個簡單的機制,但是在底層,有很多半隱藏的函數和鮮為人知的方式來實現更多功能。在這篇文章中,我將演示幾個小技巧。另外,在里也有些和時間相關的預定義方法通過關系排序一個復雜一點的技巧。幸運的是,確實有這樣的方法。 showImg(https://segmentfault.com/img/bV8L5s?w=1240&h=634); Eloquent ORM 看起來是一個簡單的機制,...

    clasnake 評論0 收藏0

發表評論

0條評論

2501207950

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<