成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

首發(fā),laravel最優(yōu)雅的分表、關(guān)聯(lián)、分頁查詢,手冊方法的熟練運(yùn)用。

fuchenxuan / 2840人閱讀

摘要:前幾天寫了一遍關(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

相關(guān)文章

  • laravel優(yōu)雅分表關(guān)聯(lián)查詢(性能較好,SQL數(shù)量=表數(shù)量,涵蓋了較多laravel手冊

    摘要:最優(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的...

    mylxsw 評論0 收藏0
  • PHP程序員如何優(yōu)雅搬磚

    摘要:這是年前的最后一篇文章,本章來聊一聊程序員如何優(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ì)放在這里,我的博客,我希望每...

    妤鋒シ 評論0 收藏0
  • Laravel 模型間關(guān)系設(shè)置分表方法

    摘要:如這個(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...

    syoya 評論0 收藏0
  • 一次難得分庫分表實(shí)踐

    摘要:煩人的數(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)...

    Harpsichord1207 評論0 收藏0
  • 20 個(gè) Laravel Eloquent 必備實(shí)用技巧

    摘要:看起來是一個(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ī)制,...

    clasnake 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<