在 Laravel 中执行过程后使用 GROUP BY?

Using GROUP BY after executing a procedure in Laravel?

执行程序后我有 table 这样的

SELECT ROW_NUMBER() OVER(ORDER BY t.name)new_id,
       t.name AS cat_name,
       f.id AS id_food 
FROM food AS f 
INNER JOIN categories AS t 
ON t.id = f.id_cat
WHERE f.quantity > 0 
ORDER BY t.name


| new_id  | cat_name | id_food |
|----     |------    | -----   |
| 1       | Seafood  | 1       |
| 2       | Seafood  | 3       |
| 3       | Seafood  | 5       |
| 4       | Beef     | 2       |
| 5       | Beef     | 16      |
| 6       | Special  | 7       |

这是我的控制器和 JSON 来自程序的值

public function first(){
    $fi = DB::select("CALL GetListCat()");
    return response()->json($fi);
    }

Result: [{"new_id":1,"cat_name":"Seafood"},
{"new_id":2,"cat_name":"Seafood"},
{"new_id":3,"cat_name":"Seafood"},
{"new_id":4,"cat_name":"Beef"},
{"new_id":5,"cat_name":"Beef"},
{"new_id":6,"cat_name":"Special"}]

现在我想在 cat_name 字段上使用 GROUP BY 所以当我 return a JSON 时,它应该只得到每个 cat_name 的第一个值是这样的(我需要保留 new_id 字段)

| new_id  | cat_name | id_food |
|----     |------    | -----   |
| 1       | Seafood  | 1       |
| 4       | Beef     | 2       |
| 6       | Special  | 7       |

Result desired: [{"new_id":1,"cat_name":"Seafood"},
{"new_id":4,"cat_name":"Beef"},
{"new_id":6,"cat_name":"Special"}]

我怎样才能做到这一点?

只需将您的数组转换为 Laravel collection,这样您就可以更轻松地对其进行操作:

$fi = [
    ["new_id" => 1, "cat_name" => "Seafood"],
    ["new_id" => 2, "cat_name" => "Seafood"],
    ["new_id" => 3, "cat_name" => "Seafood"],
    ["new_id" => 4, "cat_name" => "Beef"],
    ["new_id" => 5, "cat_name" => "Beef"],
    ["new_id" => 6, "cat_name" => "Special"],
];
$coll = collect($fi)->unique("cat_name");
dump($coll->values()->all());

输出:

=> [
     [
       "new_id" => 1,
       "cat_name" => "Seafood",
     ],
     [
       "new_id" => 4,
       "cat_name" => "Beef",
     ],
     [
       "new_id" => 6,
       "cat_name" => "Special",
     ],
   ]