首页 > 解决方案 > 如何以雄辩的方式从查询中返回 JSON 响应?

问题描述

我正在处理这个查询:(我希望我可以使用 eloquent 传递同样的查询并返回一个 JSON 作为响应。)

public function getChart(Request $request)
    {      
        $_orders = DB::table('users')
            ->join('orders','orders.user_id','=','users.id')
            ->join('model_has_roles', 'users.id', '=', 'model_has_roles.model_id')                        
            ->select('users.id','users.name', DB::raw('COUNT(orders.id) as orders_by_user'), 'model_has_roles.role_id as rol')                   
            ->where('model_has_roles.role_id', '2');
        $_orders->groupBy('orders.user_id', 'users.id',  'users.name',  'model_has_roles.role_id');
        $orders=$_orders->get();

        return ['orders' => $orders];

    }

此查询已解析并返回给我作为结果:分配了工作订单的操作员的姓名以及该操作员拥有的处于已完成状态的工作订单的数量。 为此,将用户表和订单表关联起来。

{
"orders": [
{
"id": 4,
"name": "Luis",
"orders_by_user": 2,
"rol": 2
},
{
"id": 6,
"name": "Jose",
"orders_by_user": 1,
"rol": 2
},
{
"id": 7,
"name": "Miguel",
"orders_by_user": 1,
"rol": 2
}
]
}

如果您查看我的查询响应,我的数组被称为 orders inside orders 我得到了我需要的东西:

"orders": [
{
"id": 4,
"name": "Luis",
"orders_by_user": 2,
"rol": 2
},

正如我之前提到的,我希望我可以使用 eloquent 传递同样的查询并返回一个 JSON 作为响应。

如何自定义此 JSON 响应? 它会是这样的:一个数组中的单独名称和另一个数组中的 orders_by_user

我想实现的例子

"users": [
{

"name": "Luis"
}
]
"orders": [
{

"orders_by_user": 2

}
]

我需要你的帮助

标签: phpjsonlaraveleloquent

解决方案


你可以像这样返回 json 响应

return response()->json(['name' => 'Abigail', 'state' => 'CA'])

在此处阅读文档

https://laravel.com/docs/7.x/responses#json-responses

注意 解释与@Rodrigo Ruiz 的关系

在用户模型中有你这样的关系

class User extends Model
{
    public function Orders()
    {
        return $this->hasMany(App\Order::class);
    }
}

订单模式

class Order extends Model
{
    public function user()
    {
        return $this->belongsTo(App\User::class);
    }
}

$user = User::first();

获取用户的所有订单

$orders = $user->orders()->get();

获得第一笔订单

$order = $user->orders()->first();

如果您每次调用关系,它将在每次调用时执行查询。

优化关系调用它将仅在 1 个查询中加载所有关系。

$user = User::with('orders')->get();

$order = $user->orders->first();

推荐阅读