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