有A,B,C三張表,A、B表每一個(gè)rid對(duì)應(yīng)一條數(shù)據(jù),C表一個(gè)rid對(duì)應(yīng)多條數(shù)據(jù),三張表通過rid相關(guān)聯(lián),現(xiàn)在需求是,根據(jù)rid取出A、B表中數(shù)據(jù),C表中只需要取出該rid對(duì)應(yīng)多條數(shù)據(jù)的第一條。
想到的方法是,AB表join,取出符合要求的rid,然后對(duì)遍歷每個(gè)rid,再去C表中取數(shù)據(jù),并拿到第一條,大概是這個(gè)樣子
// 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;
現(xiàn)在的做法雖然能實(shí)現(xiàn)功能,但耗時(shí)太長(zhǎng)了,請(qǐng)教下有什么優(yōu)化方案嗎?本來想讀取C表時(shí)用whereIn,但取出來還要在篩選多余數(shù)據(jù),不知道這種方法是不是比較好的實(shí)踐方法?
4 回答

搖曳的薔薇
TA貢獻(xiàn)1793條經(jīng)驗(yàn) 獲得超6個(gè)贊
- 首先wherein后去篩選數(shù)據(jù),肯定比你在循環(huán)查c表快吧。。
- 然后
join('B', 'A.rid', '=', 'B.rid')
不需要DB::raw
的

偶然的你
TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
同樣的需求
/**
* 所有日志
* @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 關(guān)注
- 1770 瀏覽
添加回答
舉報(bào)
0/150
提交
取消