gpt4 book ai didi

php - 如何在 Laravel 中明智地获得产品类别?

转载 作者:行者123 更新时间:2023-12-04 17:16:24 24 4
gpt4 key购买 nike

有人问过类似的问题 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;
});
引用:
  • "This is not a bug, it's a limitation"

  • 更新

    OP comment :

    But in this case we are fetcing all 10k products then set relation on collection


    是的,这是性能问题,但是,您的问题是关于eager的。 This is limitation .
    Eloquent 作为一种工具,而不是解决方案。它只是 SQL 的一个包装器。如果您想将每个类别的产品数量限制为 (n) ,查询变得复杂。
    要解决此问题,您需要使用 window function :
    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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com