摘要:本節(jié)將使用用戶創(chuàng)建博文來學習數(shù)據(jù)模型關(guān)聯(lián)的有關(guān)知識。我們發(fā)現(xiàn)為我們生成的時間是英文的,如果要使用中文時間,則需要對進行本地化設(shè)置。動態(tài)屬性讓你能夠訪問關(guān)聯(lián)函數(shù),就像他們是在模型中定義的屬性會假設(shè)對應關(guān)聯(lián)的外鍵名稱是基于模型名稱的。
一、Laravel常用知識總結(jié) 1.提示信息漢化本節(jié)將使用用戶創(chuàng)建博文來學習數(shù)據(jù)模型關(guān)聯(lián)的有關(guān)知識。
如果用Laravel原生的表單提示錯誤信息,則是英文的,如果需要中文,則需要修改resources/lang/en的英文,這樣比較麻煩,不過,我們可以使用github開源的漢化包,然后引入該文件夾,在config/app.php配置文件里邊修改語言包引入即可使用。
2.Carbon日期友好化處理
該方法的作用是將日期進行友好化處理,我們可以使用 tinker 來查看該方法的具體輸出情況。
$ php artisan tinker
在 tinker 中輸出第一位用戶的創(chuàng)建時間如下。
>>> $created_at = AppModelsUser::first()->created_at => CarbonCarbon {#704 +"date": "1998-12-06 03:15:31.000000", +"timezone_type": 3, +"timezone": "UTC", }
在 tinker 中調(diào)用 diffForHumans 方法來輸出,結(jié)果如下。
>>> $created_at->diffForHumans() => "17 years ago"
我們發(fā)現(xiàn) diffForHumans 為我們生成的時間是英文的,如果要使用中文時間,則需要對 Carbon 進行本地化設(shè)置。Carbon 是 PHP DateTime 的一個簡單擴展,Laravel 將其默認集成到了框架中。
三、Eloquent:關(guān)聯(lián)數(shù)據(jù)表之間經(jīng)常會互相進行關(guān)聯(lián)。例如,一篇博客文章可能會有多條評論,或是一張訂單可能對應一個下單客戶。Eloquent 讓管理和處理這些關(guān)聯(lián)變得很容易,同時也支持多種類型的關(guān)聯(lián)。
定義關(guān)聯(lián)你可在 Eloquent 模型類內(nèi)將 Eloquent 關(guān)聯(lián)定義為函數(shù)。因為關(guān)聯(lián)像 Eloquent 模型一樣也可以作為強大的 查詢語句構(gòu)造器(數(shù)據(jù)庫:查詢構(gòu)造器),定義關(guān)聯(lián)為函數(shù)提供了強而有力的鏈式調(diào)用及查找功能。例如:
$user->posts()->where("active", 1)->get();
不過,在深入了解使用關(guān)聯(lián)之前,先讓我們來學習如何定義每個類型:
1.一對一一對一關(guān)聯(lián)是很基本的關(guān)聯(lián)。例如一個 User 模型也許會對應一個 Phone。要定義這種關(guān)聯(lián),我們必須將 phone 方法放置于 User 模型上。phone 方法應該要返回基類 Eloquent 上的 hasOne 方法的結(jié)果:
hasOne("AppPhone"); } }
傳到 hasOne 方法里的第一個參數(shù)是關(guān)聯(lián)模型的類名稱。定義好關(guān)聯(lián)之后,我們就可以使用 Eloquent 的動態(tài)屬性來獲取關(guān)聯(lián)紀錄。動態(tài)屬性讓你能夠訪問關(guān)聯(lián)函數(shù),就像他們是在模型中定義的屬性:
$phone = User::find(1)->phone;
Eloquent 會假設(shè)對應關(guān)聯(lián)的外鍵名稱是基于模型名稱的。在這個例子里,它會自動假設(shè) Phone 模型擁有 user_id 外鍵。如果你想要重寫這個約定,則可以傳入第二個參數(shù)到 hasOne 方法里。
return $this->hasOne("AppPhone", "foreign_key");
此外,Eloquent 的默認外鍵在上層模型的 id 字段會有個對應值。換句話說,Eloquent 會尋找用戶的 id 字段與 Phone 模型的 user_id 字段的值相同的紀錄。如果你想讓關(guān)聯(lián)使用 id 以外的值,則可以傳遞第三個參數(shù)至 hasOne 方法來指定你自定義的鍵:
return $this->hasOne("AppPhone", "foreign_key", "local_key");定義相對的關(guān)聯(lián)
所以,我們可以從 User 訪問到 Phone 模型。現(xiàn)在,讓我們在 Phone 模型上定義一個關(guān)聯(lián),此關(guān)聯(lián)能夠讓我們訪問擁有此電話的 User。我們可以定義與 hasOne 關(guān)聯(lián)相對應的 belongsTo 方法:
belongsTo("AppUser"); } }2. 一對多
一個「一對多」關(guān)聯(lián)使用于定義單個模型擁有任意數(shù)量的其它關(guān)聯(lián)模型。例如,一篇博客文章可能會有無限多個評論。就像其它的 Eloquent 關(guān)聯(lián)一樣,可以通過放置一個函數(shù)到 Eloquent 模型上來定義一對多關(guān)聯(lián):
hasMany("AppComment"); } }
切記,Eloquent 會自動判斷 Comment 模型上正確的外鍵字段。按約定來說,Eloquent 會取用自身模型的「蛇形命名」后的名稱,并在后方加上 _id。所以,以此例來說,Eloquent 會假設(shè) Comment 模型的外鍵是 post_id。
一旦關(guān)聯(lián)被定義,則可以通過 comments 屬性來訪問評論的集合。切記,因為 Eloquent 提供了「動態(tài)屬性」,因此我們可以對關(guān)聯(lián)函數(shù)進行訪問,就像他們是在模型中定義的屬性一樣:
$comments = AppPost::find(1)->comments; foreach ($comments as $comment) { // }定義相對的關(guān)聯(lián)
現(xiàn)在我們已經(jīng)能訪問到所有文章的評論,讓我們來接著定義一個通過評論訪問上層文章的關(guān)聯(lián)。若要定義相對于 hasMany 的關(guān)聯(lián),可在下層模型定義一個叫做 belongsTo 方法的關(guān)聯(lián)函數(shù):
belongsTo("AppPost"); } }3. 多對多
多對多關(guān)聯(lián)要稍微比 hasOne 及 hasMany 關(guān)聯(lián)復雜。如一個用戶可能擁有多種身份,而一種身份能同時被多個用戶擁有。舉例來說,很多用戶都擁有「管理者」的身份。要定義這種關(guān)聯(lián),需要使用三個數(shù)據(jù)表:users、roles 和 role_user。role_user 表命名是以相關(guān)聯(lián)的兩個模型數(shù)據(jù)表來依照字母順序命名,并包含了 user_id 和 role_id 字段。
多對多關(guān)聯(lián)通過編寫一個在自身 Eloquent 類調(diào)用的 belongsToMany 的方法來定義。舉個例子,讓我們在 User 模型定義 roles 方法:
belongsToMany("AppRole"); } }定義相對的關(guān)聯(lián)
要定義相對于多對多的關(guān)聯(lián),只需簡單的放置另一個名為 belongsToMany 的方法到你關(guān)聯(lián)的模型上。讓我們接著以用戶身份為例,在 Role 模型中定義 users 方法:
belongsToMany("AppUser"); } }
如你所見,此定義除了簡單的參考 AppUser 模型外,與 User 的對應完全相同。因為我們重復使用了 belongsToMany 方法,當定義相對于多對多的關(guān)聯(lián)時,所有常用的自定義數(shù)據(jù)表與鍵的選項都是可用的。
關(guān)聯(lián)總結(jié) 1.一對一$this->hasOne("AppPhone"); $this->belongsTo("AppUser");
hasOne 關(guān)聯(lián)相對應的 belongsTo 方法
2.一對多$this->hasMany("AppComment"); $this->belongsTo("AppPost");
hasMany 關(guān)聯(lián)相對應的 belongsTo 方法
3.多對多$this->belongsToMany("AppRole"); $this->belongsToMany("AppUser");
belongsToMany 關(guān)聯(lián)相對應的 belongsToMany 方法
4.查找關(guān)聯(lián)你可以查找 posts 關(guān)聯(lián)并增加額外的條件至關(guān)聯(lián),像這樣:
$user = AppUser::find(1); $user->posts()->where("active", 1)->get();
關(guān)聯(lián)方法與動態(tài)屬性
如果你不需要增加額外的條件至 Eloquent 的關(guān)聯(lián)查找,則可以簡單的像訪問屬性一樣來訪問關(guān)聯(lián)。例如我們剛剛的 User 及 Post 模型示例,我們可以像這樣來訪問所有用戶的文章:
$user = AppUser::find(1); foreach ($user->posts as $post) { // }預加載
當通過屬性訪問 Eloquent 關(guān)聯(lián)時,該關(guān)聯(lián)數(shù)據(jù)會被「延遲加載」。意味著該關(guān)聯(lián)數(shù)據(jù)只有在你使用屬性訪問它時才會被加載。不過,Eloquent 可以在你查找上層模型時「預加載」關(guān)聯(lián)數(shù)據(jù)。預加載避免了 N + 1 查找的問題。要說明 N + 1 查找的問題,可試想一個關(guān)聯(lián)到 Author 的 Book 模型,如下所示:
belongsTo("AppAuthor"); } }
現(xiàn)在,讓我們來獲取所有書籍及其作者的數(shù)據(jù):
$books = AppBook::all(); foreach ($books as $book) { echo $book->author->name; }
上方的循環(huán)會運行一次查找并取回所有數(shù)據(jù)表上的書籍,接著每本書會運行一次查找作者的操作。因此,若存在著 25 本書,則循環(huán)就會執(zhí)行 26 次查找:1 次是查找所有書籍,其它 25 次則是在查找每本書的作者。
很幸運地,我們可以使用預加載來將查找的操作減少至 2 次。可在查找時使用 with 方法來指定想要預加載的關(guān)聯(lián)數(shù)據(jù):
$books = AppBook::with("author")->get(); foreach ($books as $book) { echo $book->author->name; }
對于該操作則只會運行兩次查找:
select * from books select * from authors where id in (1, 2, 3, 4, 5, ...)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/30545.html
摘要:而且,與是一對多關(guān)系一個分類下有很多,一個只能歸屬于一個與是一對多關(guān)系一篇博客下有很多,一條只能歸屬于一篇與是多對多關(guān)系一篇有很多,一個下有很多。 說明:本文主要聊一聊Laravel測試數(shù)據(jù)填充器Seeder的小技巧,同時介紹下Laravel開發(fā)插件三件套,這三個插件挺好用哦。同時,作者會將開發(fā)過程中的一些截圖和代碼黏上去,提高閱讀效率。 備注:在設(shè)計個人博客軟件時,總會碰到有分類Ca...
摘要:中異常處理類主要包含兩個方法和,其中就是主要用來向第三方發(fā)送異常報告,這里選擇向這個神器發(fā)送異常報告,并使用通知開發(fā)人員。通過也能發(fā)現(xiàn)的執(zhí)行流程。 說明:Laravel學習筆記之bootstrap源碼解析中聊異常處理時提到過Sentry這個神器,并打算以后聊聊這款神器,本文主要就介紹這款Errors Tracking神器Sentry,Sentry官網(wǎng)有一句話個人覺得帥呆了: Stop ...
摘要:版微信第三方登陸包括微信微博等等,查看支持列表擴展好用的圖片處理,也方便使用百度版百度版支付集合,包含支付寶等支付寶在的封裝各國語言包,包含簡體中文生成二維碼工具,親測好用未完大家可以向我推薦,直接在本文下留言即可。 Laravel不權(quán)威導航 Hi 這里是Roy整理的Laravel相關(guān)索引,希望能幫到大家showImg(http://static.segmentfault.com/bu...
摘要:為什么使用對象存儲對象存儲是云服務提供商面向企業(yè)和個人開發(fā)者提供的高可用,高穩(wěn)定,強安全的云端存儲服務。什么是阿里云對象存儲服務,簡稱,是阿里云提供的海量安全低成本高可靠的云存儲服務。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和夠用是永不停息的追求。 個人網(wǎng)站:https:/...
摘要:配置需要一個來用于與虛擬機進行連接,默認假定這個密鑰會被放在文件夾下。三使用管理項目版本使用可以對我們的代碼進行版本控制,如果萬一誤刪了代碼想回到之前的情況,則可以通過版本控制進行回滾。配置選項代表對進行全局設(shè)置。 laravel學習筆記,重新梳理知識點。 一、環(huán)境配置 1、編輯器選用 Atom PHPStorm SublimeText Atom 是由 GitHub 官方在 201...
閱讀 1094·2021-09-22 15:19
閱讀 1711·2021-08-23 09:46
閱讀 2233·2021-08-09 13:47
閱讀 1412·2019-08-30 15:55
閱讀 1420·2019-08-30 15:55
閱讀 1980·2019-08-30 15:54
閱讀 2804·2019-08-30 15:53
閱讀 718·2019-08-30 11:03