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

首頁 > 編程 > PHP > 正文

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

2020-03-22 18:39:06
字體:
來源:轉載
供稿:網友
零、什么是 Eloquent
Eloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',對象關系映射。ORM 的出現是為了幫我們把對數據庫的操作變得更加地方便。Eloquent 讓一個 'Model類' 對應一張數據庫表,并且在底層封裝了很多 'function',可以讓 Model 類非常方便地調用。
來看一段如下代碼:html' target='_blank'>class 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- 查詢出所有文章并循環打印出所有標題$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;然后你就會看到下面的錯誤:
為什么會出現錯誤?因為 `Article::where()` 了之后依然是 `Builder` 對象,還不是 `Article` 對象,不能直接取 `title`?!敖K結者”方法所謂 “終結者” 方法,指的是在 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`:class User extends Eloquent {
此時得到的 `$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() 關系,應該這么寫:class Account extends Eloquent { protected $table = 'accounts';
2.一對多關系學會了前面使用一對一關系的基礎方法,后面的幾種關系就簡單多了。我們引入一個新的Model:Pay,付款記錄。表結構應該是這樣的:user: id ... ...pay: id ... ... user_idUser 和 Pay 具有一對多關系,換句話說就是一個 User 可以有多個 Pay,這樣的話,只在 Pay 表中存在一個 `user_id` 字段即可。 `/app/models/User.php`:class User extends Eloquent {
此時得到的 `$accounts` 即為 `Illuminate/Database/Eloquent/Collection` 類的一個實例。大家應該也已經注意到了,這里不是簡單的 `- hasOneAccount` 而是 `- hasManyPays()- get()`,為什么呢?因為這里是 `hasMany`,操作的是一個對象集合。相應的 belongsTo() 的用法跟上面一對一關系一樣:class Pay extends Eloquent { protected $table = 'pays';
3.多對多關系多對多關系和之前的關系完全不一樣,因為多對多關系可能出現很多冗余數據,用之前自帶的表存不下了。我們定義兩個模型:Article 和 Tag,分別表示文章和標簽,他們是多對多的關系。表結構應該是這樣的:article: id ... ...tag: id ... ...article_tag: article_id tag_id在 Model 中使用:class 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教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩在线一区| 精品人伦一区二区三区蜜桃网站| 亚洲精品久久在线| 国产精品欧美激情| 性日韩欧美在线视频| 中文字幕日韩欧美在线| 38少妇精品导航| 精品人伦一区二区三区蜜桃免费| 久久综合色88| 中文字幕精品—区二区| 亚洲日韩中文字幕| 91精品国产91久久久| 日韩精品一区二区三区第95| 91精品国产自产在线观看永久| 日韩视频中文字幕| 九九热精品在线| 亚洲精品电影网| 久久99国产精品久久久久久久久| 国产区亚洲区欧美区| 国产视频观看一区| 欧美黑人视频一区| 欧美日韩亚洲91| 国产自产女人91一区在线观看| 欧美在线观看一区二区三区| 国产噜噜噜噜噜久久久久久久久| 久久国产一区二区三区| 91精品国产乱码久久久久久蜜臀| 亚洲日本成人女熟在线观看| 久久久爽爽爽美女图片| 91老司机在线| 亚洲毛片在线免费观看| 高清亚洲成在人网站天堂| 欧美性高跟鞋xxxxhd| 孩xxxx性bbbb欧美| 亚洲欧美制服另类日韩| 国产欧美日韩精品在线观看| 久久伊人91精品综合网站| 久久不射热爱视频精品| 亚洲精品小视频| 国产精品高清在线| 久久99精品久久久久久琪琪| 国产精品第七十二页| 国内精久久久久久久久久人| 97国产精品人人爽人人做| 成人写真福利网| 欧美在线视频网| 亚洲精品999| 国产a∨精品一区二区三区不卡| 日韩成人在线视频网站| 海角国产乱辈乱精品视频| 岛国av一区二区三区| 国产91精品在线播放| 欧美国产日韩视频| 亚洲天堂男人的天堂| 日韩电视剧免费观看网站| 色先锋久久影院av| 97视频com| 九九热最新视频//这里只有精品| 97人人模人人爽人人喊中文字| 欧美日韩国产限制| 92国产精品视频| 日韩成人中文电影| 欧美中文在线视频| 成人精品视频99在线观看免费| 国产精品美女久久久久久免费| 久久久久女教师免费一区| 亚洲欧美精品伊人久久| 亚洲人成电影网站色| 欧美性极品xxxx做受| 亚洲综合中文字幕在线观看| 久国内精品在线| 国产精品免费观看在线| 日韩精品中文字幕在线观看| 亚洲天堂色网站| 97精品视频在线播放| 日韩va亚洲va欧洲va国产| 国产欧美 在线欧美| 国产亚洲精品久久| 日韩在线观看免费av| 亚洲美女黄色片| 亚洲精品一区二三区不卡| 欧美亚洲国产视频| 欧美在线观看网站| 亚洲夜晚福利在线观看| 日韩av免费一区| 国产一区二区欧美日韩| 久久夜精品va视频免费观看| 亚洲欧美日韩精品久久| 亚洲欧美成人在线| 欧美电影电视剧在线观看| 欧美日韩福利在线观看| 国产一区二区动漫| 日本一区二区三区在线播放| 国产精品久久久久aaaa九色| 久久精品久久精品亚洲人| 国产精品igao视频| 欧美丰满少妇xxxxx| 91夜夜揉人人捏人人添红杏| 国产精品一区二区三区毛片淫片| 久久久99免费视频| 国产亚洲a∨片在线观看| 久久亚洲成人精品| 欧美影院成年免费版| 日韩在线欧美在线| 国产精品日韩欧美大师| 久久久亚洲国产天美传媒修理工| 91精品国产九九九久久久亚洲| 98午夜经典影视| 成人性生交大片免费看视频直播| 欧美中文字幕第一页| 亚洲国模精品一区| 日韩在线视频免费观看高清中文| 色综合男人天堂| 国产91色在线播放| 青草成人免费视频| 国产aaa精品| 综合欧美国产视频二区| 欧美三级欧美成人高清www| 亚洲日本中文字幕| 亚洲一区二区三区毛片| 欧美精品videos性欧美| 色偷偷偷亚洲综合网另类| 午夜精品理论片| 一区二区三区日韩在线| 欧美国产极速在线| 欧美精品电影免费在线观看| 国产亚洲精品久久久久久牛牛| 91中文精品字幕在线视频| 欧美在线免费视频| 亚洲aⅴ男人的天堂在线观看| 欧美高清性猛交| 日韩精品有码在线观看| 欧美视频13p| 亚洲色图av在线| 亚洲人成网7777777国产| 中文字幕av一区中文字幕天堂| 欧美重口另类videos人妖| 午夜精品久久久久久99热软件| 久久久最新网址| 国产精品电影一区| 国产精品久久av| 久久成人在线视频| www.日韩不卡电影av| 亚洲欧美日韩高清| 国产精品久久久久久久久免费看| 国产午夜精品一区理论片飘花| 国产精品电影久久久久电影网| 庆余年2免费日韩剧观看大牛| 国产精品嫩草影院一区二区| 国产精品91久久久久久| 亚洲男子天堂网| 国产欧美精品日韩| 精品爽片免费看久久| 成人妇女淫片aaaa视频| 国产精品高潮在线| 国产欧美日韩丝袜精品一区| 成人午夜两性视频| 日本久久久久久| 国产精品欧美激情在线播放| 亚洲精品小视频在线观看| 亚洲伊人一本大道中文字幕| 国产91网红主播在线观看| 日韩暖暖在线视频| 日韩动漫免费观看电视剧高清|