有人問過類似的問題這里。
。我正在進行API作業。我的產品表包含超過一萬種不同類別的產品。我需要減少查詢的執行時間,因此,為此,我必須修改一個API,它將只獲取每個類別的20個產品,并將整個API回應按類別分組。API回應將如下所示。
{
"data"/span>: {
"產品": {
"Beauticians & Style": [
{
"標題": "產品A"。
"價格": "0.00",
"DiscountPrice": 0.
},
{
"Title": "產品B",
"價格": "0.00",
"DiscountPrice": 0.
}
],
"Groceries": [
{
"標題": "產品G",
"價格": "0.00",
"DiscountPrice": 0.
},
{
"Title": "Product R",
"價格": "0.00",
"DiscountPrice": 0.
},
{
"Title": "產品O",
"價格": "0.00",
"DiscountPrice": 0.
},
{
"Title": "產品C",
"價格": "0.00",
"DiscountPrice": 0.
}
],
"Women's Fashion": [
{
"標題": "產品W",
"價格": "0.00",
"DiscountPrice": 0.
},
{
"Title": "產品O",
"價格": "0.00",
"DiscountPrice": 0.
},
{
"Title": "產品M",
"價格": "0.00",
"DiscountPrice": 0.
}
]
}
}
控制器
$products = Category:: with('products', function($q){
$q->take(20) 。
})->get()。
類別模型
class Category extends Model
{
use HasFactory;
public function products()
{
return $this->hasMany('AppModelsProduct', 'CategoryID', 'CategoryID') 。
}
}
我已經試過了,但沒有得到確切的結果。
uj5u.com熱心網友回復:
當以屬性形式訪問Eloquent關系時,相關模型被"懶惰加載"。這意味著在您第一次訪問該屬性之前,關系資料實際上不會被加載。
解決方案,你可以使用: Ref : OP評論: 但是在這種情況下,我們要抓取所有的10k產品,然后在集合上設定關系 是的,這是性能問題,但是,你的問題是關于eadger的。這是限制。 Eloquent是一個工具,而不是一個解決方案。它只是SQL的一個封裝器。如果你想把每個類別的產品數量限制在 為了解決這個問題,你需要使用視窗函式 : 另外,你可以使用這個Laravel Eloquent擴展,允許使用視窗函式來限制每個父級的急切加載結果的數量。 類別模型 產品模型 嘗試 這對你來說夠解釋了嗎?
uj5u.com熱心網友回復: 如果每個產品只有一個類別,你的表格結構必須如下: 而你的產品在類別中的關系必須如下: 你的產品在類別中的關系必須如下: 并將你的控制器改為:
標籤: 上一篇:laravel中間件中的終止方法
$products = Category::with('products')
->get()
->map(function ($query) {
$query->setRelation('products', $query-> products-> take(20))。
return $query;
});
Update
(n),查詢就會變得復雜。
SELECT *
FROM (
SELECT[/span
*,
ROW_NUMBER() OVER (PARTITION BY `category_id`) AS row_num
FROM `products`)
) AS temp_table
WHERE row_num <= 10
ORDER BY row_num
use StaudenmeirEloquentEagerLimitHasEagerLimit。
use AppModelsProduct;
class Category extends Model
{
use HasEagerLimit;
public function products()
{
return $this->hasMany(Product::class)。
}
}
use StaudenmeirEloquentEagerLimitHasEagerLimit。
class Product extends Model
{
use HasEagerLimit;
}
$products = Category:: with(['products' => function ($query) {
$query->最新()->limit(20)。
}])->get()。
products
id
...
category_id
類別
id
...
class Category extends Model
{
use HasFactory;
public function products()。
{
return $this->hasMany(AppModelsProduct::class)。
}
}
$products = Category:: with('products', function($q){
$q->take(20) 。
})->get()。
