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