【问题标题】:How to return JSON response from a query with eloquent?如何以雄辩的方式从查询中返回 JSON 响应?
【发布时间】:2020-07-12 12:50:45
【问题描述】:

我正在处理这个查询:(我希望我可以使用 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];

    }

此查询已解决并返回结果:分配了工作订单的操作员的姓名以及该操作员拥有的处于已完成状态的工作订单数。 为此,将 users 表和 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

}
]

我需要你的帮助

【问题讨论】:

    标签: php json laravel eloquent


    【解决方案1】:
    • 列表项

    @umefarooq 是对的,我总是按照他的步骤操作,有时如果我不希望它返回该特定模型的所有值,我会通过 Laravel API Resource 返回结果。这使您可以灵活地确定您希望从 eloquent 查询中返回哪些字段。

    在你的控制器中,而不是像这样使用它

    return response()->json($order);
    

    我是这样用的

     return OrderResource::collection($orders); 
    

    您可以将此查询自定义为您想要的任何样式,只要您知道如何 将所有必需的参数传递到集合中。 因此,如果您只想获取有关用户和订单的基本信息:

    class OrderResource extends JsonResource
    return [
               'user'=>[
                    'id' => $this->id,
                    'name' => $this->name,
                      ],
                'orders'=>[
                    'order_id' => $this->order->order_id,
                    'order_rol' =>  $this->rol
                ]
            ];
    

    【讨论】:

    • @Doble Príncipe claro es algo como lo que me comentas lo que estoy buscando tengo que ver indagar más con el enlace que me compartiste laravel.com/docs/5.8/eloquent-resources
    • 这只是一个示例。您可以阅读更多内容并享受其丰富的 API 资源格式化可能性。
    【解决方案2】:

    你可以像这样返回 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();
    

    【讨论】:

    • 我明白,但你是如何用 eloquent 传递同样的查询的!?可以指导我,所以首先我得到用户名和每个用户的订单数
    • 你需要创建模型之间的关系告诉我每个用户可以有多少个角色?
    • 用户可以具有监督操作员或管理员的角色。你可以忽略这一行 -> join ('model_has_roles', 'users.id', '=', 'model_has_roles.model_id') 并且只为每个用户带来用户名和订单只会关联订单和用户表
    • 请检查我的答案,我已经更新了模型关系。
    • muy buena tu aclaración entoces me dices que con la Consulta que me das como respuesta obtengo este resultado'''{ "users": ["Luis", "Jose" ....] "orders ": [2, 3, 5 ....] }''' dónde por ejemplo para eloperio Luis tiene 2 ordenes terminadas por赞成 confirma lo que estoy suponiendo。
    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2017-07-29
    • 2021-01-12
    • 2015-07-07
    相关资源
    最近更新 更多