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

首頁 > 開發(fā) > PHP > 正文

詳解PHP的Laravel框架中Eloquent對(duì)象關(guān)系映射使用

2024-05-04 23:43:20
字體:
供稿:網(wǎng)友
這篇文章主要介紹了PHP的Laravel框架中Eloquent對(duì)象關(guān)系映射使用,重點(diǎn)講述了Eloquent的數(shù)據(jù)模型間關(guān)系,需要的朋友可以參考下
 

零、什么是 Eloquent
Eloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',對(duì)象關(guān)系映射。ORM 的出現(xiàn)是為了幫我們把對(duì)數(shù)據(jù)庫的操作變得更加地方便。

Eloquent 讓一個(gè) 'Model類' 對(duì)應(yīng)一張數(shù)據(jù)庫表,并且在底層封裝了很多 'function',可以讓 Model 類非常方便地調(diào)用。
來看一段如下代碼:

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

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

這個(gè)類簡(jiǎn)直再簡(jiǎn)單不過了,沒有指定命名空間,沒有構(gòu)造函數(shù),如果那一行沒有意義的代碼也不算上的話,這個(gè)文件就只有兩個(gè)有實(shí)際意義的東西: 'Article' 和 '/Eloquent'。沒錯(cuò),Eloquent 就是這么屌炸天,只需要繼承一下 Eloquent 類,就可以干 'first() find() where() orderBy()' 等非常非常多的事情,這就是面向?qū)ο蟮膹?qiáng)大威力。

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

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

找到 id 為 2 的文章打印其標(biāo)題

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

查找標(biāo)題為“我是標(biāo)題”的文章,并打印 id

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

查詢出所有文章并循環(huán)打印出所有標(biāo)題

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

查找 id 在 10~20 之間的所有文章并打印所有標(biāo)題

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

查詢出所有文章并循環(huán)打印出所有標(biāo)題,按照 updated_at 倒序排序

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

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

2. 所有的中間方法如 'where()' 'orderBy()' 等都能夠同時(shí)支持 '靜態(tài)' 和 '非靜態(tài)鏈?zhǔn)?#39; 兩種方式調(diào)用,即 'Article::where()...' 和 'Article::....->where()'。

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

二、中間操作流
Builder 這個(gè)單詞可以直譯成構(gòu)造器,但是“中間操作流”更容易理解,因?yàn)閿?shù)據(jù)庫操作大部分時(shí)候都是鏈?zhǔn)讲僮鞯摹?/p>

中間操作流,請(qǐng)看代碼:

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

這段代碼的 `::where()->where()->orderBy()` 就是中間操作流。中間操作流用面向?qū)ο蟮姆椒▉砝斫?,可以總結(jié)成一句話:

創(chuàng)建一個(gè)對(duì)象,并不斷修改它的屬性,最后用一個(gè)操作來觸發(fā)數(shù)據(jù)庫操作。
如何找到中間操作流的蛛絲馬跡

中間操作流這個(gè)東西,文檔里幾乎沒有任何有價(jià)值的信息,那么,我們?cè)撛趺凑页鲞@個(gè)玩意兒呢?很簡(jiǎn)單,使用以下代碼:

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

然后你就會(huì)看到下面的錯(cuò)誤:

詳解PHP的Laravel框架中Eloquent對(duì)象關(guān)系映射使用

為什么會(huì)出現(xiàn)錯(cuò)誤?因?yàn)?`Article::where()` 了之后依然是 `Builder` 對(duì)象,還不是 `Article` 對(duì)象,不能直接取 `title`。

“終結(jié)者”方法

所謂 “終結(jié)者” 方法,指的是在 N 個(gè)中間操作流方法對(duì)某個(gè) Eloquent 對(duì)象進(jìn)行加工以后,觸發(fā)最終的數(shù)據(jù)庫查詢操作,得到返回值。

`first()` `get()` `paginate()` `count()` `delete()` 是用的比較多的一些 “終結(jié)者” 方法,他們會(huì)在中間操作流的最后出現(xiàn),把 SQL 打給數(shù)據(jù)庫,得到返回?cái)?shù)據(jù),經(jīng)過加工返回一個(gè) Article 對(duì)象或者一群 Article 對(duì)象的集合。

復(fù)雜用法示例

 

復(fù)制代碼代碼如下:

 

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

 

 

三、模型間關(guān)系(關(guān)聯(lián))
1.一對(duì)一關(guān)系

顧名思義,這描述的是兩個(gè)模型之間一對(duì)一的關(guān)系。這種關(guān)系是不需要中間表的。

假如我們有兩個(gè)模型:User 和 Account,分別對(duì)應(yīng)注冊(cè)用戶和消費(fèi)者,他們是一對(duì)一的關(guān)系,那么如果我們要使用 Eloquent 提供的一對(duì)一關(guān)系方法,表結(jié)構(gòu)應(yīng)該是這樣的:

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

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

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

然后,當(dāng)我們需要用到這種關(guān)系的時(shí)候,該如何使用呢?如下:

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

此時(shí)得到的 `$account` 即為 `Account` 類的一個(gè)實(shí)例。

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

這段代碼除了展示了一對(duì)一關(guān)系該如何使用之外,還傳達(dá)了三點(diǎn)信息,也是我對(duì)于大家使用 Eloquent 時(shí)候的建議:

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

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

(3). 每次使用模型間關(guān)系的時(shí)候都寫全參數(shù),不要省略
相應(yīng)的,如果使用 belongsTo() 關(guān)系,應(yīng)該這么寫:

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

2.一對(duì)多關(guān)系

學(xué)會(huì)了前面使用一對(duì)一關(guān)系的基礎(chǔ)方法,后面的幾種關(guān)系就簡(jiǎn)單多了。

我們引入一個(gè)新的Model:Pay,付款記錄。表結(jié)構(gòu)應(yīng)該是這樣的:

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

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

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

然后,當(dāng)我們需要用到這種關(guān)系的時(shí)候,該如何使用呢?如下:

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

此時(shí)得到的 `$accounts` 即為 `Illuminate/Database/Eloquent/Collection` 類的一個(gè)實(shí)例。大家應(yīng)該也已經(jīng)注意到了,這里不是簡(jiǎn)單的 `-> hasOneAccount` 而是 `->hasManyPays()->get()`,為什么呢?因?yàn)檫@里是 `hasMany`,操作的是一個(gè)對(duì)象集合。

相應(yīng)的 belongsTo() 的用法跟上面一對(duì)一關(guān)系一樣:

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

3.多對(duì)多關(guān)系

多對(duì)多關(guān)系和之前的關(guān)系完全不一樣,因?yàn)槎鄬?duì)多關(guān)系可能出現(xiàn)很多冗余數(shù)據(jù),用之前自帶的表存不下了。

我們定義兩個(gè)模型:Article 和 Tag,分別表示文章和標(biāo)簽,他們是多對(duì)多的關(guān)系。表結(jié)構(gòu)應(yīng)該是這樣的:

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'); }}

需要注意的是,第三個(gè)參數(shù)是本類的 id,第四個(gè)參數(shù)是第一個(gè)參數(shù)那個(gè)類的 id。

使用跟 hasMany 一樣:

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

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

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

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');}

對(duì),你沒有看錯(cuò),可以 belongsToMany 自己。
其他關(guān)系

Eloquent 還提供 “遠(yuǎn)層一對(duì)多關(guān)聯(lián)”、“多態(tài)關(guān)聯(lián)” 和 “多態(tài)的多對(duì)多關(guān)聯(lián)” 這另外三種用法,經(jīng)過上面的學(xué)習(xí),我們已經(jīng)掌握了 Eloquent 模型間關(guān)系的基本概念和使用方法,剩下的幾種不常用的方法就留到我們用到的時(shí)候再自己探索吧。

重要技巧:關(guān)系預(yù)載入
你也許已經(jīng)發(fā)現(xiàn)了,在一對(duì)一關(guān)系中,如果我們需要一次性查詢出10個(gè) User 并帶上對(duì)應(yīng)的 Account 的話,那么就需要給數(shù)據(jù)庫打 1 + 10 條 SQL,這樣性能是很差的。我們可以使用一個(gè)重要的特性,關(guān)系預(yù)載入:http://laravel-china.org/docs/eloquent#eager-loading

直接上代碼:

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

這樣生成的 SQL 就是這個(gè)樣子的:

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

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



注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到PHP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人国产精品一级毛片视频| 成人日韩欧美| 俺去了亚洲欧美日韩| 日本一区免费观看| 97超级在线观看免费高清完整版电视剧| www.4438全国最大| 2022国产精品| 中国大陆高清aⅴ毛片| 亚洲一区欧美激情| 精品国产91亚洲一区二区三区婷婷| 精品视频免费| 精品人妻二区中文字幕| 久久精品五月| 在线视频不卡国产| 亚洲美女视频网| 人禽交欧美网站| 精品一区二区久久| 久久成人福利视频| 成人写真视频福利网| 日韩欧美亚洲一二三区| 在线观看福利电影| 久久婷五月综合| 不卡一卡2卡3卡4卡精品在| 国产精品一区一区三区| 国产毛片久久| 欧美日韩一二三四| 国产成人综合一区二区三区| 成人在线看片网站| 亚洲国产精品久久久久久6q| 欧美高清视频一区| 久久这里只有精品1| 樱桃国产成人精品视频| 91免费国产视频网站| 一本一本久久a久久精品综合妖精| 久久人人爽爽人人爽人人片av| 国产67194| 日韩av电影一区| zzijzzij亚洲日本成熟少妇| 精品成人av一区二区三区| 日本怡春院一区二区| 国产aⅴ精品一区二区三区久久| 天堂www在线а√天堂| www操操操| 欧美日韩免费一区二区三区视频| 成人性生交大片免费看视频直播| 日韩免费黄色片| 亚洲午夜激情网页| 国产成人午夜精品5599| 亚洲国产91色在线| 日韩精品成人| 最新中文字幕2018| 网站一区二区| 久久综合另类图片小说| 欧美 日韩 综合| 日韩极品视频在线观看| 91tv精品福利国产在线观看| 惠美惠精品网| 奇米四色7777| asian性开放少妇pics| 国产高清在线精品一区二区三区| 韩国美女主播一区| 欧美熟妇一区二区| 午夜国产在线| 3d动漫精品啪啪一区二区竹菊| 亚洲 国产 图片| 国产女人高潮的av毛片| 少妇高潮久久久久久潘金莲| 欧亚成年男女午夜| 国产一区二区三区四区在线观看| av日韩中文字幕| 欧美成人第一页| 亚洲第一偷拍| 99精品一区| 国产精品91一区二区三区| 亚洲永久免费网站| 国产99re66在线视频| 国产精品wwwwww| 91免费视频黄| 欧美性受xxxx| 99在线视频精品| 欧美熟妇精品一区二区蜜桃视频| 亚洲精品中文字幕有码专区| 免费一级suv好看的国产网站| 欧美日韩国产精品成人| 久久精品久久精品久久| 激情久久免费视频| 国产欧美视频一区二区| 亚洲精品国产精品国| 欧美大胆成人| 精品国产99久久久久久宅男i| 日本激情免费| 三妻四妾的电影电视剧在线观看| 国产一区二区区别| 亚洲日本欧美日韩高观看| 国产精品免费麻豆入口| 精品成人av一区二区三区| 国产91免费看| 水蜜桃精品av一区二区| 在线观看免费p片视频网站地址| 精品xxxxxbbbb欧美中文| 日韩一区二区三| 精品久久中文字幕| 亚洲精品亚洲人成在线观看| 亚洲精品无amm毛片| 欧美日韩国产成人在线免费| 色哟哟一一国产精品| 久久躁狠狠躁夜夜爽| 日本三级在线播放完整版| 性网站在线观看| 亚洲一级一级97网| 九九热视频精品| 国产精品91一区二区| mm131亚洲精品| 在线亚洲国产精品网站| 97久久香蕉国产线看观看| www.com毛片| 91亚洲精品在看在线观看高清| 疯狂做受xxxⅹ高潮视频免费| 久久久高清一区二区三区| 国产成人综合亚洲91猫咪| 国产精品国产三级国产专播品爱网| 亚洲男人电影天堂| 欧美三级午夜理伦三级| 在线免费国产视频| 国产91精品一区| 亚洲国产天堂久久综合网| 国产福利视频在线播放| 日韩人妻无码精品综合区| 色一情一乱一伦一区二区三区| 丰满少妇高潮在线观看| 四季av日韩精品一区| 青青草原综合久久大伊人精品| 精品人妻少妇嫩草av无码| 91成人在线免费观看| 久久久亚洲天堂| 成年人在线看| 午夜精品国产| 亚洲精品1234| 国产免费a级片| 国产精品美女高潮无套| 日本三级电影在线看| 青青草视频在线免费直播| 最新国产乱人伦偷精品免费网站| 伊人国产视频| 成人免费在线观看视频网站| 久久一区二区中文字幕| 国产亚洲字幕| 中文字幕欧美激情极品| 亚洲网站在线免费观看| 伊人成年综合网| 福利在线视频导航| 成人c视频免费高清在线观看| 成人久久久精品乱码一区二区三区| 日本一区二区三区在线观看| 亚洲最大福利网| 国产毛片毛片毛片毛片毛片| 久久国产精品久久久久久久久久| 欧美精品一区三区| 一本色道久久综合狠狠躁篇的优点| 毛片视频网站在线观看| 免费欧美在线视频| 国产精品久久久久久久久久久久久久久久| 久久国产精品 国产精品| 骚虎黄色影院| 久久人人99| 欧美日韩国产丝袜另类| www.91av.cn| 99久久精品一区二区成人| 国产高清自产拍av在线| se01亚洲视频| 日本成人免费网站| 国产精品亚洲第一区| 日日碰狠狠丁香久燥| 日本不卡视频在线| 在线观看日本黄色| 77777少妇光屁股久久一区| 欧美精品videos另类日本| 欧美在线极品| 要久久爱电视剧全集完整观看| 亚洲无吗一区二区三区| 色欲欲www成人网站| 亚洲一区二区不卡免费| 国产一级片免费视频| 国产女人18毛片18精品| 亚洲区免费影片| 图片区小说区区亚洲影院| 天堂资源在线中文| 黑丝美女一区二区| 精品国产av一区二区| www.麻豆传媒| 国产日韩亚洲欧美在线| 一二三四在线观看视频| 午夜精品免费在线观看| 精品女厕厕露p撒尿| 夜级特黄日本大片_在线| 色婷婷久久久亚洲一区二区三区| 99热自拍偷拍| 天堂а在线中文在线无限看推荐| 成**人特级毛片www免费| 久久亚洲国产精品成人av秋霞| 不卡视频免费播放| 亚洲国产精品国自产拍av| www.国产免费| 黄色的网站在线观看| 成人午夜视频在线播放| 欧美在线色视频| 老司机福利av| 欧洲grand老妇人| 欧美一区影院| 阿v视频在线| 99热精品在线| 国产免费一区| 亚洲在线视频网站| 伊人精品综合| 天堂在线免费av| 三级视频网站在线| 亚洲免费观看| 日韩一区二区在线观看视频| 亚洲精品免费在线看| 色综合天天天天做夜夜夜夜做| 男女一区二区三区免费| 亚洲女人天堂色在线7777| 色哟哟网站入口亚洲精品| 国产精品视频一区二区三区四区五区| 酒色婷婷桃色成人免费av网| www.国产麻豆| 公交车强行挺进岳身体| 欧美日韩精品免费观看视一区二区| 国产伦精品一区| 爽爽爽在线观看| 国产精品理伦片| 狂野欧美性猛交xxxx乱大交| 亚洲精品蜜桃久久久久久| 99视频精品全部免费看| 久久人人爽人人爽人人片av免费| 欧美国产综合| www.久色| 久久久久久a亚洲欧洲aⅴ| 国产精华7777777| 国产亚洲精品超碰| 一二区成人影院电影网| 精品夜夜嗨av一区二区三区| 三级国产在线观看| 国产伦精一区二区三区| 欧美黑人乱大交| 国产精品自产拍在线观看| 亚洲 欧美 日韩 国产综合 在线| wwww在线观看免费视频| 99国内精品久久久久| 青青色在线视频| 国产精品片aa在线观看| 精品视频在线一区二区在线| 国产精品传媒在线观看| h网站免费观看| 日本aaa视频| 伊人发布在线| 一本大道av一区二区在线播放| 亚洲美女黄色片| 精品美女www爽爽爽视频| 亚洲视频在线看| 日本精品国产| www99xav| 女人18毛片一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 91丨porny丨九色| 人妻av一区二区三区| 欧美日韩国产免费观看视频| 国产ts人妖一区二区三区| 在线观看日本视频| 拔插拔插海外华人免费| 亚洲激精日韩激精欧美精品| 久久av免费一区| 国产精品你懂的在线| 久久婷婷国产综合尤物精品| 久久久久久久亚洲| 国产69精品久久久久毛片| 国产精品自在| 亚洲成av人**亚洲成av**| 国内外激情在线| 人妻视频一区二区三区| 日中文字幕在线| 国产午夜精品理论片a级大结局| 成人丁香基地| 国产精品久久久| 天天射天天综合网| 极度色播免费播放视频| 欧美日韩国产成人在线观看| 992tv成人免费观看| 国产精品久久久久久久久久久久冷| 久久婷婷丁香| 亚洲天堂影院在线观看| 欧美 另类 交| 一本一道无码中文字幕精品热| 中文字幕电影在线观看| 日本一区视频在线观看免费| 偷窥少妇高潮呻吟av久久免费| 亚洲精品一区中文字幕电影| 四虎影视永久免费在线观看一区二区三区| 天天躁日日躁成人字幕aⅴ| 欧美有码在线视频| 欧美一区二区性| 中文字幕中文字幕在线中文字幕三区| 日韩中文字幕在线视频播放| 午夜视频一区二区三区| 宅男深夜国产| 成人免费视频网站入口| 亚洲福利视频在线| 日批视频在线看| 一区二区视频欧美| 人与牲动交xxxxbbb| 亚洲成色www8888| 97视频在线免费| 国产欧美日韩卡一| 国产精品视频精品视频| 欧美色欧美亚洲另类七区| 中文字幕一区二区人妻在线不卡| 国产91精品一区二区绿帽| 成人免费视频网站入口| 天堂av中文在线| 日韩欧美综合一区| 丰满岳乱妇一区二区| 成人听书哪个软件好| 99精品在线视频观看| 欧美日韩精品免费观看视欧美高清免费大片| 色综合一区二区日本韩国亚洲| 久久免费精品国产| av播放在线| 青青青爽在线视频免费观看|