【问题标题】:Lumen how to build serialised structure from models collection?Lumen 如何从模型集合中构建序列化结构?
【发布时间】:2026-01-28 19:20:04
【问题描述】:

我在数据库中有几个表,有关系。例如:

user table
- id
- name
- email
- created_at

orders table
- id
- user_id
- status
- created_at

order_items table
- id
- order_id
- item_id
- count

items table
- id 
- article
- name
- ...

最后我需要将数据转换到这个视图 - 订单:

[
  {
    "id": 1,
    "status": "created",
    "user": {"id":1, "name":"Max"},
    "items":[{"id":1, "name":"Banana", "count": 2}, {...item two}]
  },
  {
    .. order two
  }
]

某些字段将被隐藏(created_at 等),并且所有选择的模型都与其相关。

所以,我可以做类似的事情

$userOrders = Orders::where([
    'user_id' => $request->user()->id
])
    ->select(['id'])
    ->with('orders.items') // <<<< oops nested relations
    ->get();

但是问题:

  1. 如何使用嵌套关系进行选择
  2. 如何从嵌套关系中只保留需要的字段(当字段列表取决于场景时,最好基于模型场景)

【问题讨论】:

    标签: laravel laravel-5.2 lumen


    【解决方案1】:

    您不想选择任何内容,只需使用...

    $userOrders = Orders::with('orders.items')->where('user_id', $request->user()->id)->get();
    

    您要隐藏的内容将设置在每个单独的模型上。

    例如,假设在用户的属性上,您想隐藏created_at 列。添加属性...

    protected $hidden = ['created_at', 'updated_at'];  // + any other fields you want to hide on the user model.
    

    【讨论】:

    • 是否可以设置单独的隐藏“规则”?让我解释一下,在为 /v1/orders 选择订单时,我想返回没有 created_attr 的模型,但是当 /v1/orderInfo 我想返回所有模型属性时..