来自两个表的JSON数据,不重复连接表主键

时间:2017-01-14 20:42:16

标签: php laravel laravel-5.2

我有两种模式:

Category模型包含:id PRIMARY_KEYcategory_name...

Item模型包含:id PRIMARY_KEYitem_namecategory_id(类别表上的ID),...

我希望实现这个JSON响应:

Item:
{
    "id": 1,
    "item_name": "some item name",
    "category": {
        "id": "5",
        "category_name": "some category name"
    }
}

到目前为止,我已成功实现了回应:

{
    "id": 1,
    "item_name": "some item name",
    "category_id": "5", // i dont want it to appear here!
    "category": {
        "id": "5",
        "category_name": "some category name"
    }
}

使用查询:

$data = Item::select('id', 'item_name', 'category_id')->with(['category' => function ($query) {
            $query->select('id', 'category_name');
        }])->get();
return response()->json($data);

我尝试了select('id', 'item_name')而不是select('id', 'item_name', 'category_id'),但它失败了,因为with需要'category_id'才能工作。对此有任何干净的解决方案吗?

2 个答案:

答案 0 :(得分:0)

解决方案是在Collection中使其$data = Item::select('id', 'item_name', 'category_id')->with(['category' => function ($query) { $query->select('id', 'category_name'); }])->get()->makeHidden('category_id'); return response()->json($data);

{{1}}

答案 1 :(得分:0)

是的,您无法删除category_id,因为它需要创建关系。在查询并设置$data后,您可以执行类似的操作。

$response = [];
$data->each(function ($value) use (&$response) { // pass $response by reference
    unset($value->category_id);
    $response[] = $value;
});
return response()->json($response);