我有一個類別表。每個類別都有一些帖子。我想獲得他們最近 10 篇文章的類別。所以我嘗試了這個:
Category::query()->with(['posts' => function($q) {
$q->take(10);
}])->get();
問題不是在每個類別記錄中放置 10 個帖子,而是在所有類別專案中回傳總共 10 個帖子。
預期的:
C1:
id: 1
posts: 10 post
C2:
id: 2
posts: 10 post
我得到了什么
C1:
id: 1
posts: 4 post
C2:
id: 2
posts: 6 post
uj5u.com熱心網友回復:
會試試這個版本
Category::with('posts')->get()->map(function($category) {
$category->posts = $category->posts->take(10);
return $category;
});
or optimize version try this package [link][1]
[1]: https://github.com/staudenmeir/eloquent-eager-limit
uj5u.com熱心網友回復:
事實上,這不是一項微不足道的任務。您提供的代碼生成兩個查詢:
SELECT * FROM categories;
SELECT * FROM posts WHERE category_id IN (1, 2, 3, ...) LIMIT 10;
第二個查詢只選擇 10 個帖子,而不是每個類別 10 個。
要為每個類別選擇 10 個帖子,您可以進行以下查詢:
SELECT * FROM (
SELECT *, row_number() OVER(PARTITION BY category_id) rn FROM posts
) posts
WHERE rn <= 10 AND category_id IN (1, 2, 3 ...);
現在讓我們通過 Laravel 的 queryBuilder 來實作它:
$result = Category::with(['posts' => static function($q) {
$q->fromSub(
Post::selectRaw('*, row_number() OVER(PARTITION BY category_id) rn'),
'posts'
)->where('rn', '<=', 10);
}])->get();
因此,我們仍然只進行 2 次查詢并只選擇必要的帖子(不要拉取整個表)
uj5u.com熱心網友回復:
Category::query()->with(['posts' => function($q) {
$q->latest()->take(10);
}])->get();
如果您的表至少有 10 行的資料,這應該沒問題。我認為 Post 表只有一個 category_id 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/535705.html
標籤:拉维雄辩规范关系
上一篇:如何使用CarbonPeriod將陣列從_date變為to_date并匹配另一個日期是否存在于陣列中或不存在于php,Laravel
