为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel连表查询,一个rid对应多条数据,但只需要一条数据,如何优化?

Laravel连表查询,一个rid对应多条数据,但只需要一条数据,如何优化?

PHP
狐的传说 2019-03-18 18:05:41
有A,B,C三张表,A、B表每一个rid对应一条数据,C表一个rid对应多条数据,三张表通过rid相关联,现在需求是,根据rid取出A、B表中数据,C表中只需要取出该rid对应多条数据的第一条。 想到的方法是,AB表join,取出符合要求的rid,然后对遍历每个rid,再去C表中取数据,并拿到第一条,大概是这个样子 // Laravel $result = DB::table('A') ->join('B', DB::raw('A.rid'), '=', DB::raw('B.rid') ->where('condition', '=', 'somecondition') ->get(array(DB::raw(A.rid))); $rows = array(); foreach ($result as $r) { $c = DB::table('C')->where('rid', '=', $r['rid'])->first(); $rows[] = array( 'rid' => $c['rid'], 'key' => $c['value'] ); } return $rows; 现在的做法虽然能实现功能,但耗时太长了,请教下有什么优化方案吗?本来想读取C表时用whereIn,但取出来还要在筛选多余数据,不知道这种方法是不是比较好的实践方法?
查看完整描述

4 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

  • 首先wherein后去筛选数据,肯定比你在循环查c表快吧。。
  • 然后join('B', 'A.rid', '=', 'B.rid')不需要DB::raw
查看完整回答
反对 回复 2019-03-18
?
偶然的你

TA贡献1841条经验 获得超3个赞

同样的需求

    /**
     * 所有日志
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function hasLogs ()
    {
        return $this->hasMany( LeadLog::class, 'leads_id', 'id' )
            ->orderBy('track_at', 'desc');
    }

    /**
     * 最新一条日志
     * @return \Illuminate\Database\Eloquent\Relations\HasOne
     */
    public function lastLog ()
    {
        return $this->hasOne(LeadLog::class, 'leads_id', 'id')
            ->select('id', 'leads_id','content', 'track_at')
            ->orderByDesc('id')
            ->groupBy('leads_id','id', 'track_at', 'content');
    }
查看完整回答
反对 回复 2019-03-18
  • 4 回答
  • 0 关注
  • 1740 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信