有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 回答
![?](http://img1.sycdn.imooc.com/545867790001599f02200220-100-100.jpg)
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
- 首先wherein后去筛选数据,肯定比你在循环查c表快吧。。
- 然后
join('B', 'A.rid', '=', 'B.rid')
不需要DB::raw
的
![?](http://img1.sycdn.imooc.com/545845b40001de9902200220-100-100.jpg)
偶然的你
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');
}
- 4 回答
- 0 关注
- 1740 浏览
添加回答
举报
0/150
提交
取消