资讯专栏INFORMATION COLUMN

首发,laravel最优雅的分表、关联、分页查询,手册方法的熟练运用。

fuchenxuan / 2521人阅读

摘要:前几天写了一遍关于分表关联的查询,但是我个人觉得还不算完美,于是今天重新看了一下模型的底层代码,终于写出我暂时觉得最满意的代码风格,简洁优雅是核心。关联查询用了渴求式加载,就能有效减少的条数,保证数据库的性能。

前几天写了一遍关于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的条数,保证数据库的性能。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25686.html

相关文章

  • laravel优雅分表关联查询(性能较好,SQL数量=表数量,涵盖了较多laravel手册

    摘要:最优就只能是查询表的数量才算是比较合理,完全有足够的能力写出优雅的代码很多人可能会想到的原生查询了么。但是有强大的关联,访问器修改,查询范围等等这些功能让你的代码非常简洁。相信熟悉的人已经知道怎么查询了,可以达到最优化的,和最优雅的写法。 终于被产品的各种刁钻不合常理的需求磨炼出用laravel写出较为优雅的代码,在这里给大家分享一下。 先简单介绍一下基本环境,我们是做一款直播APP的...

    mylxsw 评论0 收藏0
  • PHP程序员如何优雅搬砖

    摘要:这是年前的最后一篇文章,本章来聊一聊程序员如何优雅的搬砖搬砖既为达到目的,不断重复某项工作的行为,其实与造轮子一样,不谋而合基础这里的基础并非单指其技术能力,技术底蕴,更有意体现程序员在初期不断重复的工作而获得的感想与意识。 showImg(https://segmentfault.com/img/bVbnSFx?w=800&h=444); 我一生的文章都会放在这里,我的博客,我希望每...

    妤锋シ 评论0 收藏0
  • Laravel 模型间关系设置分表方法

    摘要:如这个很简单,那么在模型间关系比如,等使用这种方式的情况下,如何设置分表呢找了半天没找到好的办法,以为例,只好复制类中的方法,改成,并传入表名,并且在函数里对象实例化后调用,果然可以。 在实际开发中经常用到分库分表,比如用户表分成 100 张,那么这个时候查询数据需要设置分表,比如 Laravel 的 Model 类中提供了 setTable 方法: /** * Set the ta...

    syoya 评论0 收藏0
  • 一次难得分库分表实践

    摘要:烦人的数据迁移分表规则弄好后其实只是完成了分表的第一步,真正麻烦的是数据迁移,或者说是如何做到对业务影响最小的数据迁移。 showImg(https://segmentfault.com/img/remote/1460000020003851?w=1920&h=1080); 背景 前不久发过两篇关于分表的文章: 一次分表踩坑实践的探讨 分表后需要注意的二三事 从标题可以看得出来,当...

    Harpsichord1207 评论0 收藏0
  • 20 个 Laravel Eloquent 必备实用技巧

    摘要:看起来是一个简单的机制,但是在底层,有很多半隐藏的函数和鲜为人知的方式来实现更多功能。在这篇文章中,我将演示几个小技巧。另外,在里也有些和时间相关的预定义方法通过关系排序一个复杂一点的技巧。幸运的是,确实有这样的方法。 showImg(https://segmentfault.com/img/bV8L5s?w=1240&h=634); Eloquent ORM 看起来是一个简单的机制,...

    clasnake 评论0 收藏0

发表评论

0条评论

fuchenxuan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<