摘要:前幾天寫了一遍關(guān)于分表關(guān)聯(lián)的查詢,但是我個(gè)人覺得還不算完美,于是今天重新看了一下模型的底層代碼,終于寫出我暫時(shí)覺得最滿意的代碼風(fēng)格,簡潔優(yōu)雅是核心。關(guān)聯(lián)查詢用了渴求式加載,就能有效減少的條數(shù),保證數(shù)據(jù)庫的性能。
前幾天寫了一遍關(guān)于laravel分表關(guān)聯(lián)的查詢,但是我個(gè)人覺得還不算完美,于是今天重新看了一下laravel模型的底層代碼,終于寫出我暫時(shí)覺得最滿意的代碼-laravel風(fēng)格,簡潔、優(yōu)雅是核心。
下面直接上demo代碼,主要是3個(gè)表,一個(gè)用戶表,一個(gè)是用戶送禮表,送禮表按月分表
user表
id用戶ID
nickname昵稱
send_gift_2017_07,send_gift_2017_08 送禮表
id自增主鍵
user_id用戶ID
worth禮物價(jià)值
uper_id主播ID(也是用戶表的)
created_at送禮時(shí)間belongsTo(User::class); } 關(guān)聯(lián)用戶表 外鍵是uper_id public function uper() { return $this->belongsTo(User::class); } }現(xiàn)在做一個(gè)輸入開始日期和結(jié)束日期查看用戶的送禮記錄并且分頁。
copy(); $i->format("Y-m") <= $end->format("Y-m"); $i->addMonth()) { $queries->push( DB::table("send_gift_{$i->format("Y_m")}") // 建議都用select查詢字段,SQL盡可能的優(yōu)化性能 ->select("user_id", "worth", "uper_id", "created_at") ->whereBetween("created_at", [$start, $end->tomorrow()]) ); } // 出列一張表作為union的開始 $unionQuery = $queries->shift(); // 循環(huán)剩下的表添加union $queries->each(function ($item, $key) use ($unionQuery) { $unionQuery->unionAll($item); }); // 設(shè)置臨時(shí)表的名稱,添加臨時(shí)表,順序不能反過來,否則用關(guān)聯(lián)約束會(huì)找不到表 $lists = with(new SendGift)->setTable("union_send_gift") // 添加臨時(shí)表 ->from(DB::raw("({$unionQuery->toSql()}) as union_send_gift")) // 合并查詢條件 ->mergeBindings($unionQuery) // 關(guān)聯(lián)約束,不在用戶表的不用查出來 ->has("user") // 按時(shí)間倒序 ->orderBy("created_at", "desc") // 分頁 ->paginate(); // 加載關(guān)聯(lián)關(guān)系 $lists->load([ "user" => function ($query) { // 關(guān)聯(lián)查詢也要優(yōu)化sql $query->select("id", "nickname"); }, "uper" => function ($query) { $query->select("id", "nickname"); } ]); // 測試結(jié)果 $lists->each(function ($item, $key) { echo "用戶:{$item->user_id}-{$item->user->nickname}在{$item->created_at->toDateTimeString()}送出了價(jià)值{$item->worth}元的禮物給主播:{$item->uper_id}-{$item->uper->nickname}
"; }); } }然后我們看看SQL。
關(guān)聯(lián)查詢用了渴求式加載,就能有效減少SQL的條數(shù),保證數(shù)據(jù)庫的性能。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25686.html
摘要:最優(yōu)就只能是查詢表的數(shù)量才算是比較合理,完全有足夠的能力寫出優(yōu)雅的代碼很多人可能會(huì)想到的原生查詢了么。但是有強(qiáng)大的關(guān)聯(lián),訪問器修改,查詢范圍等等這些功能讓你的代碼非常簡潔。相信熟悉的人已經(jīng)知道怎么查詢了,可以達(dá)到最優(yōu)化的,和最優(yōu)雅的寫法。 終于被產(chǎn)品的各種刁鉆不合常理的需求磨煉出用laravel寫出較為優(yōu)雅的代碼,在這里給大家分享一下。 先簡單介紹一下基本環(huán)境,我們是做一款直播APP的...
摘要:這是年前的最后一篇文章,本章來聊一聊程序員如何優(yōu)雅的搬磚搬磚既為達(dá)到目的,不斷重復(fù)某項(xiàng)工作的行為,其實(shí)與造輪子一樣,不謀而合基礎(chǔ)這里的基礎(chǔ)并非單指其技術(shù)能力,技術(shù)底蘊(yùn),更有意體現(xiàn)程序員在初期不斷重復(fù)的工作而獲得的感想與意識(shí)。 showImg(https://segmentfault.com/img/bVbnSFx?w=800&h=444); 我一生的文章都會(huì)放在這里,我的博客,我希望每...
摘要:如這個(gè)很簡單,那么在模型間關(guān)系比如,等使用這種方式的情況下,如何設(shè)置分表呢找了半天沒找到好的辦法,以為例,只好復(fù)制類中的方法,改成,并傳入表名,并且在函數(shù)里對象實(shí)例化后調(diào)用,果然可以。 在實(shí)際開發(fā)中經(jīng)常用到分庫分表,比如用戶表分成 100 張,那么這個(gè)時(shí)候查詢數(shù)據(jù)需要設(shè)置分表,比如 Laravel 的 Model 類中提供了 setTable 方法: /** * Set the ta...
摘要:煩人的數(shù)據(jù)遷移分表規(guī)則弄好后其實(shí)只是完成了分表的第一步,真正麻煩的是數(shù)據(jù)遷移,或者說是如何做到對業(yè)務(wù)影響最小的數(shù)據(jù)遷移。 showImg(https://segmentfault.com/img/remote/1460000020003851?w=1920&h=1080); 背景 前不久發(fā)過兩篇關(guān)于分表的文章: 一次分表踩坑實(shí)踐的探討 分表后需要注意的二三事 從標(biāo)題可以看得出來,當(dāng)...
摘要:看起來是一個(gè)簡單的機(jī)制,但是在底層,有很多半隱藏的函數(shù)和鮮為人知的方式來實(shí)現(xiàn)更多功能。在這篇文章中,我將演示幾個(gè)小技巧。另外,在里也有些和時(shí)間相關(guān)的預(yù)定義方法通過關(guān)系排序一個(gè)復(fù)雜一點(diǎn)的技巧。幸運(yùn)的是,確實(shí)有這樣的方法。 showImg(https://segmentfault.com/img/bV8L5s?w=1240&h=634); Eloquent ORM 看起來是一個(gè)簡單的機(jī)制,...
閱讀 1607·2021-11-02 14:48
閱讀 3663·2019-08-30 15:56
閱讀 2777·2019-08-30 15:53
閱讀 3218·2019-08-30 14:09
閱讀 3109·2019-08-30 12:59
閱讀 2864·2019-08-29 18:38
閱讀 2702·2019-08-26 11:41
閱讀 2222·2019-08-23 16:45