作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人问过类似的问题 here .
我正在研究 API。我的产品表包含超过一万种不同类别的产品。我需要减少查询执行时间,因此为此目的,我必须修改一个 API,该 API 将仅获取每个类别的 20 个产品,并将整个 API 响应按类别分组。 API 响应将如下所示。
{
"data": {
"products": {
"Beauticians & Style": [
{
"Title": "Product A",
"Price": "0.00",
"DiscountPrice": 0
},
{
"Title": "Product B",
"Price": "0.00",
"DiscountPrice": 0
}
],
"Groceries": [
{
"Title": "Product G",
"Price": "0.00",
"DiscountPrice": 0
},
{
"Title": "Product R",
"Price": "0.00",
"DiscountPrice": 0
},
{
"Title": "Product O",
"Price": "0.00",
"DiscountPrice": 0
},
{
"Title": "Product C",
"Price": "0.00",
"DiscountPrice": 0
}
],
"Women's Fashion": [
{
"Title": "Product W",
"Price": "0.00",
"DiscountPrice": 0
},
{
"Title": "Product O",
"Price": "0.00",
"DiscountPrice": 0
},
{
"Title": "Product M",
"Price": "0.00",
"DiscountPrice": 0
}
]
}
}
Controller
$products = Category::with('products', function($q){
$q->take(20);
})->get();
分类型号
class Category extends Model
{
use HasFactory;
public function products()
{
return $this->hasMany('App\Models\Product', 'CategoryID', 'CategoryID');
}
}
我试过这个,但没有得到确切的结果。
最佳答案
当访问 Eloquent 关系作为属性时,相关模型为 “懒加载” . 这意味着在您第一次访问该属性之前不会实际加载关系数据。
解决方案,您可以使用:
$products = Category::with('products')
->get()
->map(function ($query) {
$query->setRelation('products', $query->products->take(20));
return $query;
});
引用:
OP comment :
But in this case we are fetcing all 10k products then set relation on collection
(n)
,查询变得复杂。
SELECT *
FROM (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY `category_id`) AS row_num
FROM `products`
) AS temp_table
WHERE row_num <= 10
ORDER BY row_num
或者,您可以使用
this Laravel Eloquent extension允许使用窗口函数限制每个父级的预先加载结果的数量。
use Staudenmeir\EloquentEagerLimit\HasEagerLimit;
use App\Models\Product;
class Category extends Model
{
use HasEagerLimit;
public function products()
{
return $this->hasMany(Product::class);
}
}
产品型号
use Staudenmeir\EloquentEagerLimit\HasEagerLimit;
class Product extends Model
{
use HasEagerLimit;
}
试试
$products = Category::with(['products' => function ($query) {
$query->latest()->limit(20);
}])->get();
这对你解释够了吗?
关于php - 如何在 Laravel 中明智地获得产品类别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68634417/
我是一名优秀的程序员,十分优秀!