例如,
假設我們有一個用戶表和一個帖子表。
用戶表有id和name列。
帖子表具有creator_id和approved_by_id兩者存在(參考)在用戶表中。
我怎樣才能用一個查詢急切地加載它?
select * from posts where id in (z)
select * from users where id in (x,y) //(creator, approver)
目前我有這些關系:
public function created_by()
{
return $this->belongsTo(User::class, 'creator_id');
}
public function approved_by()
{
return $this->belongsTo(User::class, 'approved_by_id');
}
uj5u.com熱心網友回復:
我保證你沒有運行一個足夠大的資料集,因為急切加載的性能是一個問題。但是,如果有多個查詢困擾您并且您寧愿承擔管理查詢構建器命令的技術債務,我認為這應該可行:
$post = Post::select('posts.*')
->selectRaw('creator.name as creator_name')
->selectRaw('approver.name as approver_name')
->leftJoin('users as creator', 'posts.creator_id', 'creator.id')
->leftJoin('users as approver', 'posts.approved_by_id', 'approver.id')
->where('posts.id', $post_id)
->get();
我們只是用不同的別名兩次加入用戶表;為避免覆寫列值,它們也需要別名。當然,您的資料將采用不同的格式,您將無法訪問諸如此類的內容$post->created_by->name,而是依賴于列別名。
等效的 SQL 查詢將是:
SELECT posts.*, creator.name AS creator_name, approver.name AS approver_name
FROM posts
LEFT JOIN users AS creator ON (posts.creator_id = creator.id)
LEFT JOIN users AS approver ON (posts.approved_by_id = approver.id)
WHERE posts.id = ?
uj5u.com熱心網友回復:
如果我正確理解了這個問題
User::with(['created_by', 'approved_by'])
->get()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/379634.html
下一篇:刀片中的Laravel8路由
