欧美成人午夜免费全部完,亚洲午夜福利精品久久,а√最新版在线天堂,另类亚洲综合区图片小说区,亚洲欧美日韩精品色xxx

扣丁學(xué)堂PHP培訓(xùn)簡述Laravel關(guān)聯(lián)模型中過濾結(jié)果為空的結(jié)果集及has和with區(qū)別

2019-05-10 13:50:21 3921瀏覽

本篇文章扣丁學(xué)堂PHP培訓(xùn)小編給讀者們分享一下Laravel關(guān)聯(lián)模型中過濾結(jié)果為空的結(jié)果集及has和with區(qū)別,對PHP開發(fā)技術(shù)感興趣的小伙伴就隨小編來了解一下吧,希望對小伙伴們有幫助。


扣丁學(xué)堂PHP培訓(xùn)簡述Laravel關(guān)聯(lián)模型中過濾結(jié)果為空的結(jié)果集及has和with區(qū)別


首先看代碼:


$userCoupons = UserCoupons::with(['coupon' => function($query) use($groupId){
 return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([
   'group_id' => $groupId,
 ]);
}])
// 更多查詢省略...


數(shù)據(jù)結(jié)構(gòu)是三張表用戶優(yōu)惠券表(user_coupons)、優(yōu)惠券表(coupons),商家表(corps),組優(yōu)惠券表(group_coupons) (為了方便查看,后兩項(xiàng)已去除)


這里我本意想用模型關(guān)聯(lián)查出用戶優(yōu)惠券中屬于給定組gourpId的所有數(shù)據(jù)(如果為空該條數(shù)據(jù)就不返回)。


但有些結(jié)果不是我們想要的:


array(20) {
 ["id"]=>
 int(6)
 ["user_id"]=>
 int(1)
 ["corp_id"]=>
 int(1)
 ["coupon_id"]=>
 int(4)
 ["obtain_time"]=>
 int(1539739569)
 ["receive_time"]=>
 int(1539739569)
 ["status"]=>
 int(1)
 ["expires_time"]=>
 int(1540603569)
 ["is_selling"]=>
 int(0)
 ["from_id"]=>
 int(0)
 ["sell_type"]=>
 int(0)
 ["sell_time"]=>
 int(0)
 ["sell_user_id"]=>
 int(0)
 ["is_compose"]=>
 int(0)
 ["group_cover"]=>
 string(0) ""
 ["is_delete"]=>
 int(0)
 ["score"]=>
 int(100)
 ["created_at"]=>
 NULL
 ["updated_at"]=>
 NULL
 ["coupon"]=>
 NULL // 注意返回了coupons為空的數(shù)據(jù)
}


記錄中有的coupon有記錄,有的為空。想想也是,with只是用sql的in()實(shí)現(xiàn)的所謂預(yù)加載。無論怎樣主user_coupons的數(shù)據(jù)都是會(huì)列出的。


它會(huì)有兩條sql查詢,第一條查主數(shù)據(jù),第二條查關(guān)聯(lián),這里第二條sql如下:


select `id`, `group_id`, `cover`, `group_number`, `group_cover` from `youquan_coupons` where `youquan_coupons`.`id` in (1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 13, 14) and (`group_id` = 1) and `youquan_coupons`.`deleted_at` is null


如果第二條為空,主記錄的關(guān)聯(lián)字段就是NULL。


后來看到了Laravel關(guān)聯(lián)的模型的has()方法,has()是基于存在的關(guān)聯(lián)查詢,下面我們用whereHas()(一樣作用,只是更高級(jí),方便寫條件)


這里我們思想是把判斷有沒有優(yōu)惠券數(shù)據(jù)也放在第一次查詢邏輯中,所以才能實(shí)現(xiàn)篩選空記錄。

加上whereHas()后的代碼如下:


$userCoupons = UserCoupons::whereHas('coupon', function($query) use($groupId){
  return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover')->where([
   'group_id' => $groupId,
  ]);
 })->with(['coupon' => function($query) use($groupId){
  return $query->select('id', 'group_id', 'cover', 'group_number', 'group_cover');
 }])-> // ...


看下最終的SQL:


select * from `youquan_user_coupons` where exists (select `id`, `group_id`, `cover`, `group_number`, `group_cover` from `youquan_coupons` where `youquan_user_coupons`.`coupon_id` = `youquan_coupons`.`id` and (`group_ids` = 1) and `youquan_coupons`.`deleted_at` is null) and (`status` = 1 and `user_id` = 1)


這里實(shí)際上是用exists()篩選存在的記錄。然后走下一步的with()查詢,因?yàn)榇藭r(shí)都篩選一遍了,所以with可以去掉條件。


顯然區(qū)分這兩個(gè)的作用很重要,尤其是在列表中,不用特意去篩選為空的數(shù)據(jù),而且好做分頁。



以上就是扣丁學(xué)堂PHP在線學(xué)習(xí)小編給大家分享的Laravel關(guān)聯(lián)模型中過濾結(jié)果為空的結(jié)果集及has和with區(qū)別,希望對小伙伴們有所幫助,想要了解更多內(nèi)容的小伙伴可以登錄扣丁學(xué)堂官網(wǎng)咨詢。


想要學(xué)好PHP開發(fā)小編給大家推薦口碑良好的扣丁學(xué)堂,扣丁學(xué)堂有專業(yè)老師制定的PHP學(xué)習(xí)路線圖輔助學(xué)員學(xué)習(xí),此外還有與時(shí)俱進(jìn)的PHP課程體系和PHP視頻教程供大家學(xué)習(xí),想要學(xué)好PHP開發(fā)技術(shù)的小伙伴快快行動(dòng)吧??鄱W(xué)堂PHP技術(shù)交流群:374332265。


扣丁學(xué)堂微信公眾號(hào)                              HTML5前端開發(fā)VIP免費(fèi)公開課

     【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】           【掃碼進(jìn)入HTML5前端開發(fā)VIP免費(fèi)公開課



查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>


標(biāo)簽: PHP培訓(xùn) PHP基礎(chǔ)教程 PHP學(xué)習(xí)視頻 PHP教學(xué)視頻 PHP入門教程 PHP教程視頻 PHP在線學(xué)習(xí) PHP在線視頻 PHP在線教程 扣丁學(xué)堂PHP培訓(xùn)

熱門專區(qū)

暫無熱門資訊

課程推薦

微信
微博
15311698296

全國免費(fèi)咨詢熱線

郵箱:codingke@1000phone.com

官方群:148715490

北京千鋒互聯(lián)科技有限公司版權(quán)所有   北京市海淀區(qū)寶盛北里西區(qū)28號(hào)中關(guān)村智誠科創(chuàng)大廈4層
京ICP備2021002079號(hào)-2   Copyright ? 2017 - 2022
返回頂部 返回頂部