国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > PHP > 正文

詳解PHP的Laravel框架中Eloquent對象關系映射使用

2024-05-04 23:43:20
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了PHP的Laravel框架中Eloquent對象關系映射使用,重點講述了Eloquent的數據模型間關系,需要的朋友可以參考下
 

零、什么是 Eloquent
Eloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',對象關系映射。ORM 的出現是為了幫我們把對數據庫的操作變得更加地方便。

Eloquent 讓一個 'Model類' 對應一張數據庫表,并且在底層封裝了很多 'function',可以讓 Model 類非常方便地調用。
來看一段如下代碼:

<?phpclass Article extends /Eloquent {protected $fillable = [];}

'protected $fillable = [];' 這一行代碼在這里沒有任何價值,是 generator 自動生成的,在此我們不做討論。

這個類簡直再簡單不過了,沒有指定命名空間,沒有構造函數,如果那一行沒有意義的代碼也不算上的話,這個文件就只有兩個有實際意義的東西: 'Article' 和 '/Eloquent'。沒錯,Eloquent 就是這么屌炸天,只需要繼承一下 Eloquent 類,就可以干 'first() find() where() orderBy()' 等非常非常多的事情,這就是面向對象的強大威力。

一、Eloquent 基本用法
Eloquent 中文文檔在:http://laravel-china.org/docs/eloquent

廢話不多說,下面我將直接展示 Eloquent 的幾種常見用法的代碼。

找到 id 為 2 的文章打印其標題

$article = Article::find(2);echo $article->title;

查找標題為“我是標題”的文章,并打印 id

$article = Article::where('title', '我是標題')->first();echo $article->id;

查詢出所有文章并循環打印出所有標題

$articles = Article::all(); // 此處得到的 $articles 是一個對象集合,可以在后面加上 '->toArray()' 變成多維數組。foreach ($articles as $article) {  echo $article->title;}

查找 id 在 10~20 之間的所有文章并打印所有標題

$articles = Article::where('id', '>', 10)->where('id', '<', 20)->get();foreach ($articles as $article) {  echo $article->title;}

查詢出所有文章并循環打印出所有標題,按照 updated_at 倒序排序

$articles = Article::where('id', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();foreach ($articles as $article) {  echo $article->title;}

基礎使用要點
1. 每一個繼承了 Eloquent 的類都有兩個 '固定用法' 'Article::find($number)' 'Article::all()',前者會得到一個帶有數據庫中取出來值的對象,后者會得到一個包含整個數據庫的對象合集。

2. 所有的中間方法如 'where()' 'orderBy()' 等都能夠同時支持 '靜態' 和 '非靜態鏈式' 兩種方式調用,即 'Article::where()...' 和 'Article::....->where()'。

3. 所有的 '非固定用法' 的調用最后都需要一個操作來 '收尾',本片教程中有兩個 '收尾操作':'->get()' 和 '->first()'。

二、中間操作流
Builder 這個單詞可以直譯成構造器,但是“中間操作流”更容易理解,因為數據庫操作大部分時候都是鏈式操作的。

中間操作流,請看代碼:

Article::where('id', '>', 10)->where('id', '<', 20)->orderBy('updated_at', 'desc')->get();

這段代碼的 `::where()->where()->orderBy()` 就是中間操作流。中間操作流用面向對象的方法來理解,可以總結成一句話:

創建一個對象,并不斷修改它的屬性,最后用一個操作來觸發數據庫操作。
如何找到中間操作流的蛛絲馬跡

中間操作流這個東西,文檔里幾乎沒有任何有價值的信息,那么,我們該怎么找出這個玩意兒呢?很簡單,使用以下代碼:

$builder = Article::where('title', "我是標題")->title;

然后你就會看到下面的錯誤:

詳解PHP的Laravel框架中Eloquent對象關系映射使用

為什么會出現錯誤?因為 `Article::where()` 了之后依然是 `Builder` 對象,還不是 `Article` 對象,不能直接取 `title`。

“終結者”方法

所謂 “終結者” 方法,指的是在 N 個中間操作流方法對某個 Eloquent 對象進行加工以后,觸發最終的數據庫查詢操作,得到返回值。

`first()` `get()` `paginate()` `count()` `delete()` 是用的比較多的一些 “終結者” 方法,他們會在中間操作流的最后出現,把 SQL 打給數據庫,得到返回數據,經過加工返回一個 Article 對象或者一群 Article 對象的集合。

復雜用法示例

 

復制代碼代碼如下:

 

Article::where('id', '>', '100')->where('id', '<', '200')->orWhere('top', 1)->belongsToCategory()->where('category_level', '>', '1')->paginate(10);

 

 

三、模型間關系(關聯)
1.一對一關系

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

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

user: id ... ... account_idaccount: id ... ... user_id

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

<?phpclass User extends Eloquent {  protected $table = 'users'; public function hasOneAccount() {   return $this->hasOne('Account', 'user_id', 'id'); }}

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

$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 時候的建議:

(1). 每一個 Model 中都指定表名

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

(3). 每次使用模型間關系的時候都寫全參數,不要省略
相應的,如果使用 belongsTo() 關系,應該這么寫:

<?phpclass Account extends Eloquent { protected $table = 'accounts';  public function belongsToUser() {  return $this->belongsTo('User', 'user_id', 'id'); }}

2.一對多關系

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

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

user: id ... ...pay: id ... ... user_id

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

<?phpclass User extends Eloquent {  protected $table = 'users'; public function hasManyPays() {  return $this->hasMany('Pay', 'user_id', 'id'); }}

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

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

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

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

<?phpclass Pay extends Eloquent { protected $table = 'pays';  public function belongsToUser() {  return $this->belongsTo('User', 'user_id', 'id'); }}

3.多對多關系

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

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

article: id ... ...tag: id ... ...article_tag: article_id tag_id

在 Model 中使用:

<?phpclass Tag extends Eloquent { protected $table = 'tags';  public function belongsToManyArticle() {  return $this->belongsToMany('Article', 'article_tag', 'tag_id', 'article_id'); }}

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

使用跟 hasMany 一樣:

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

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

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

public 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

直接上代碼:

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

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

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

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



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
免费电影网站在线视频观看福利| 日本成人免费网站| 青草在线视频在线观看| 国产日本视频| 午夜视频在线看| 国产黄色片大全| 美女网站在线观看| 青草青在线视频| 国产美女福利在线| 精品a在线观看| 国产欧美日韩专区| 136福利第一导航国产在线| 国产性色视频| 2019年中文字幕| 蜜桃av在线免费观看| 午夜视频在线看| av三级在线观看| 亚洲免费国产| 狠狠插狠狠操| 黄色网址在线免费播放| 国产鲁鲁视频在线观看免费| 国产特级淫片免费看| 日本视频二区| 国产精品亚洲第五区在线| 福利视频在线看| 国产一起色一起爱| 精品福利影院| 美女国产在线| 国产午夜电影| 日本韩国精品一区二区| 国产一区二区三区不卡免费观看 | 国产国产国产国产国产国产| 国产精品久久久久永久免费看| 中文字幕2019第三页| 午夜不卡视频| 国产在线播放av| 亚洲成人在线播放| av网站在线播放| 在线播放国产区| 精品国产免费第一区二区| 五月综合网站| 最新国产在线精品91尤物| 国产中文字幕在线| 激情四房婷婷| 最近中文字幕大全中文字幕免费 | av网站在线播放| 国产精品9区| 国产一级二级在线| 国产免费永久在线观看| 午夜小视频在线| av资源网站在线观看| 日本欧洲一区| 女人色在线免费视频| 免费国产视频| 中文字幕中文字幕在线中高清免费版 | 国产一区二区三区四区尤物| 国产一级影片| 中文字幕2020第一页| 三级小说一区| 青青草观看免费视频在线| 国产中文字幕在线播放| 国产区在线观看| 亚洲第一区视频| 中文字幕人成高视频| 国产视频中文字幕| 国产高清自拍视频在线观看 | 国产精品久久久久久精| 92久久精品| 欧美性猛交xxxx免费看久久| 国产毛片在线| 精品一区二区三区在线观看l| 国产精品久久久久久精| 在线视频三级| 国产精品一区二区三区四区色| 国产视频青青| 久热免费视频| 精品国产高清自在线一区二区三区 | av影视在线看| **三级三级97片毛片| 97在线免费| 国产亚洲精品久久久久久移动网络| 国产高清视频在线| 成年黄网站在线观看免费| 国产精品久久精品牛牛影视| 日本卡一卡2卡3卡4精品卡网站| 好吊日视频在线观看| 99福利在线| 国产二级片在线| 中中文字幕av在线| 波多野结衣中文字幕久久| 国产二区视频在线观看| 国产鲁鲁视频在线观看特色| sese在线视频| 四虎成人免费| 91亚洲精选| 国产午夜在线视频| 国产免费专区| www.色五月| 在线视频三区| 国产免费高清| 四虎网站在线观看| 国产黄色一级电影| 国产网站av| 国产精品免费视频二三区| 中文字幕日本在线观看| 国产你懂的在线观看| 交视频在线观看国产| 99爱视频在线观看| 国产二级c片l毛片| 国产精品18久久久久网站| 中文字幕在线观看播放| 中文字幕成人乱码在线电影| 午夜在线小视频| 午夜国产福利在线| 国产美女视频一区二区三区| 欧美亚洲系列| 狠狠色丁香婷婷| 国产男女猛烈无遮挡免费视频| 快射av在线播放一区| 免费观看久久久久| 玖玖在线视频| 久热国产在线| 天天操人人爽| 在线视频色在线| 亚洲第一成人在线视频| 在线成人一区| 亚洲欧美中文字幕在线观看| av网站大全在线| 欧美国产中文| 超碰免费在线观看| 免费精品国产自产拍在| 国产嫩草在线视频| 国产娇喘精品一区二区三区图片| 国产天堂在线| 亚洲sss视频| 久久99亚洲网美利坚合众国| 中文字幕第一页av| 在线三级av| 国产美女在线免费观看| 精品a在线观看| av在线免费播放| 国产美女视频一区二区三区| 国产深夜视频在线观看| 99热免费观看| 秋霞av在线| √天堂中文在线| 欧美精品小视频| 国产三级视频| 免费的黄网站在线观看| 国产午夜视频| 九九热视频在线观看| 国产福利小视频在线| 可以免费看污视频的网站| 在线天堂视频| 国产天堂在线| 国产在线观看18| 在线观看精品视频一区二区三区| 热99re久久精品这里都是免费| 天天操天天是| av网站大全在线观看| 国产黄视频在线观看| 国产在线高潮| 亚洲精品久久久成人| 国产一级又黄| 国产毛片在线| 免费观看久久久久| 天天插天天操| www在线视频| www.99色.com| 天天草天天草| a视频在线观看免费| 伊人av免费在线观看| 中文在线官网天堂| 精品国产高清a毛片无毒不卡| 国产在线观看av| 麻豆av在线| 好看的中文字幕在线播放 | 国产一级网站视频在线| 狠狠狠狠狠狠操| 狠狠操狠狠色| 黄色av网址在线免费观看| 激情六月婷婷| 中文字幕视频免费在线观看| 中文字幕成人乱码在线电影| 国产私人影院| 99精品老司机免费视频| av三级在线观看| 天天草天天爽| 久色视频在线观看| 成在线人视频免费视频| 中文字幕视频在线免费| 国产精品久久在线| 国产无遮挡又黄又爽免费网站| 国产欧美日韩专区| 色欧美在线观看| 久久99精品久久久久久野外| 五月天天在线| 精品视频二区| 久久久久久久美女| 国产激情视频一区二区|