亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

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

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

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

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

 ?phphtml' target='_blank'>class Article extends /Eloquent {protected $fillable = [];}

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

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

一、Eloquent 基本用法

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

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

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

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

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

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

$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;

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

2016226161019074.jpg (929×97)

為什么會出現錯誤?因為 `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 {
}

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

$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 
}

2.一對多關系

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

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

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

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

 ?phpclass User extends Eloquent {
}

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

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

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

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

 ?phpclass Pay extends Eloquent { protected $table = pays 
}

3.多對多關系

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

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

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

在 Model 中使用:

 ?phpclass Tag extends Eloquent { protected $table = tags 
}

需要注意的是,第三個參數是本類的 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 !

相關推薦:

如何PHP中Laravel框架實現supervisor執行異步進程

PHP的Laravel框架中的event事件操作的解析

以上就是關于PHP的Laravel框架中Eloquent對象關系映射的使用的詳細內容,PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产亚洲精品日韩| 亚洲va欧美va在线观看| 国产精品久久久久不卡| 日韩免费观看在线观看| 久久国产精品99国产精| 国产精品黄页免费高清在线观看| 91精品国产沙发| 97精品视频在线| 亚洲人成电影网站色…| 久久人人97超碰精品888| 国产黑人绿帽在线第一区| 日韩中文字幕欧美| 国产精品扒开腿爽爽爽视频| 国产精品丝袜久久久久久高清| 久久国产精品99国产精| 日韩美女中文字幕| 91精品国产高清自在线| 久久久国产精品亚洲一区| 亚洲品质视频自拍网| 国产精品观看在线亚洲人成网| 91亚洲va在线va天堂va国| www高清在线视频日韩欧美| 亚洲成人免费网站| 视频直播国产精品| 性欧美xxxx交| 伊人一区二区三区久久精品| 国产suv精品一区二区三区88区| 久久高清视频免费| 国产一区二区三区在线视频| 91久久久久久| 最近的2019中文字幕免费一页| 97精品在线观看| 色无极亚洲影院| 亚洲精品有码在线| 精品国产精品三级精品av网址| 一区二区三区视频观看| 国产成人av在线播放| 欧美成人三级视频网站| 日韩亚洲精品电影| 亚洲图片欧美午夜| 亚洲一区二区三区成人在线视频精品| 国产免费久久av| 亚洲午夜女主播在线直播| 亚洲老头老太hd| 国产精品mp4| 国产精品av免费在线观看| 亚洲欧美国内爽妇网| 国产成人精品日本亚洲专区61| 亚洲淫片在线视频| 欧美激情久久久久久| 日本精品久久久久影院| 欧美日韩国产中文精品字幕自在自线| 欧美理论电影网| 国产一区二区色| 成人久久久久爱| 国产一区二区三区在线播放免费观看| 欧美在线观看www| 久久这里有精品视频| 91精品中国老女人| 亚洲黄色免费三级| 精品成人乱色一区二区| 免费不卡欧美自拍视频| 国产精品久久久久影院日本| 成人xxxx视频| 国产精品亚洲综合天堂夜夜| 欧美日本精品在线| 亚洲xxx大片| 97久久久免费福利网址| 久久九九热免费视频| 奇米一区二区三区四区久久| 欧美成人亚洲成人日韩成人| 国内精品国产三级国产在线专| 国产亚洲综合久久| 国产精品免费网站| 精品国产一区二区三区久久狼5月| 国产精品va在线播放我和闺蜜| 午夜精品福利电影| 国产91在线播放| 日韩福利伦理影院免费| 国产综合色香蕉精品| 青青在线视频一区二区三区| 不卡av在线网站| 插插插亚洲综合网| 久久精品国产96久久久香蕉| 2018国产精品视频| 国产一区二区三区三区在线观看| 国产精品无av码在线观看| 91超碰caoporn97人人| 亚洲成av人乱码色午夜| 国产精品海角社区在线观看| 国语自产在线不卡| 欧美性猛交xxxx黑人| 久久不射热爱视频精品| 国产精自产拍久久久久久| 亚洲香蕉伊综合在人在线视看| 久久国产精品久久久久久| 在线播放日韩精品| 亚洲国产成人久久综合| 91精品久久久久久久久青青| 亚洲精品美女久久| 国产精品高精视频免费| 欧美日韩精品在线观看| 欧美成人精品xxx| 成人黄色午夜影院| 欧美激情网友自拍| 欧美日韩亚洲视频一区| 欧美国产日韩一区二区三区| 亚洲最新av在线网站| 精品亚洲国产视频| 国产成人综合久久| 欧美日韩国产在线播放| 精品无人区乱码1区2区3区在线| 国产日韩在线免费| 日韩免费观看在线观看| 日韩在线一区二区三区免费视频| 国产欧美精品一区二区三区-老狼| 91精品久久久久久久久久入口| 91日本在线视频| 亚洲a∨日韩av高清在线观看| 久久久久久香蕉网| 国产精品久久久| 亚洲精品99久久久久中文字幕| 色综合久久天天综线观看| 国产精品 欧美在线| 欧美性色xo影院| 91精品视频在线播放| 中文字幕日韩精品在线| 日韩在线视频观看正片免费网站| 日本欧美爱爱爱| 欧美日本啪啪无遮挡网站| 久热精品视频在线观看| 国产精品偷伦一区二区| 欧美中文字幕在线视频| 欧美黑人性视频| 色综合色综合网色综合| 色综合色综合网色综合| 精品国产一区二区三区久久狼5月| 欧美韩国理论所午夜片917电影| 久久好看免费视频| 久久久亚洲福利精品午夜| 国产精品国产福利国产秒拍| 欧美成人四级hd版| 国产成人福利夜色影视| 伦伦影院午夜日韩欧美限制| 国产成人精品免高潮在线观看| 2019日本中文字幕| 免费91在线视频| 日本精品久久久久久久| 国产欧美亚洲视频| 亚洲男人天堂网| 亚洲影视中文字幕| 91久久精品国产91性色| 成人黄色短视频在线观看| 亚洲性线免费观看视频成熟| 欧美在线视频在线播放完整版免费观看| 色偷偷偷亚洲综合网另类| 日产精品久久久一区二区福利| 国产精品www色诱视频| 日韩欧中文字幕| 亚洲经典中文字幕| 91在线观看免费高清| 久久久精品一区二区三区| 亚洲欧洲免费视频| 久久久97精品|