php 如何在Laravel 9中对对象数组进行排序并将最小值添加到父数组[重复]

aydmsdu9  于 2023-05-16  发布在  PHP
关注(0)|答案(1)|浏览(115)

此问题已在此处有答案

Laravel - Eloquent "Has", "With", "WhereHas" - What do they mean?(2个答案)
3天前关闭。
我有一个回应,即以下内容:

[{
      "id":7,
      "name": "Product Name",
      "versions":[
         {
            "id":1,
            "amount":199
         },
         {
            "id":2,
            "amount":99
         }
      ]
}]

在Laravel Controller中,我做了以下操作:

$q = Product::select(*)->with('getProductVersion');
$product = $q->WhereHas('getProductVersion', function($q){
           $q->orderBy('amount', 'asc'); })->get();

return $product;

getProductVersion是Product和Version之间的多对多关系。
然而,排序不正确,预期结果是

[{
      "id":7,
      "name": "Product Name",
      "lowest_amount": 99,
      "versions":[
         {
            "id":2,
            "amount":99
         },
         {
            "id":1,
            "amount":199
         }
      ]
}]

对对象数组进行排序,并将最小值打印到父数组。

u1ehiz5o

u1ehiz5o1#

您需要更改WhereHas,并使用with

$q = Product::select('*')->with(['getProductVersion' => function($query) {
    $query->orderBy('amount', 'asc');
}])->get();

with()方法,用于急切地加载getProductVersion关系,该关系带有一个闭包,该闭包按amount属性以升序对相关版本进行排序
请参阅:https://stackoverflow.com/a/30232227/4613828
如果需要分配最低值,则需要更多:

$products = Product::with(['getProductVersion' => function($query) {
    $query->orderBy('amount', 'asc');
}])->get()->map(function($product) {
    $product->lowest_amount = $product->getProductVersion->min('amount') ?? null;
});

return $product;

相关问题