尝试将两个JSON响应合并为一个,但是问题是数据显示在两个数组中,而我希望在一个数组中显示。如何在Lumen / Laravel中实现它
试图添加两个数组或响应
public function index(Request $request)
{
$post = Post::orderBy('id', 'DESC')->get();
$post_images = PostImage::orderBy('id', 'DESC')->get();
return $this->successResponse($posts.$post_image );
}
预期:-
{
"post": {
"id": 14,
"post_id": 798965728,
"user_id": 1,
"location": "first",
"title": "un8852",
"cooked_time": "1554329910",
"dispose_time": "1554373110",
"food_type": "nv",
"description": "asdfg",
"serve_quantity": 23,
"lat": 19.08,
"lon": 73,
"id": 10,
"post_id": 798965728,
"image_name1": null,
"image_name2": null,
"image_name3": null,
"image_name4": null,
"image_name5": null,
},
"st": "1",
"msg": "success"
}
知道:-
{
"post":"{\"id\":14,\"post_id\":798965728,\"user_id\":1,\"location\":\"first\",\"title\":\"un8852\",\"cooked_time\":\"1554329910\",\"dispose_time\":\"1554373110\",\"food_type\":\"nv\",\"description\":\"asdfg\",\"serve_quantity\":23,\"lat\":19.08,\"lon\":73,\"created_at\":\"2019-04-04 10:20:18\",\"updated_at\":\"2019-04-04 10:20:18\"}{\"id\":10,\"post_id\":798965728,\"image_name1\":null,\"image_name2\":null,\"image_name3\":null,\"image_name4\":null,\"image_name5\":null,\"created_at\":\"2019-04-04 10:20:18\",\"updated_at\":\"2019-04-04 10:20:18\"}",
"st":"1",
"msg":"success"
}
答案 0 :(得分:1)
那里有一些遗失的部分,但我想我知道发生了什么事。
根据您获得的结果,此代码中的$posts
和$post_image
似乎是雄辩的模型。
return $this->successResponse($posts.$post_image );
连接它们时,它们的__toString()
方法将它们转换为字符串,这是使用toJson()
方法完成的。因此,基本上,您将两个JSON对象粘在一起,这不是有效的JSON,然后successResponse()
方法再次对它们进行编码。
要合并它们,可以将它们转换为数组,合并它们,然后将结果传递给successResponse()
。
$merged = array_merge($posts->toArray(), $post_image->toArray());
return $this->successResponse($merged);
但是,您想要的结果是不可能的。 “发布”对象具有两个不同的“ id”值。您将只能获得一个。如果您使用
$merged = array_merge($posts->toArray(), $post_image->toArray());
然后,第二个对象的id值将替换第一个对象。如果要保留第一个id值,则需要使用并集而不是array_merge
。
$merged = $a->toArray() + $b->toArray();
答案 1 :(得分:0)
我认为您不能将2个JSON对象串联为字符串。
正确的方法是:
获取Post和PostImage对象
$ post = Post :: orderBy('id','DESC')-> get();
$ post_images = PostImage :: orderBy('id','DESC')-> get();
序列化Post对象 https://laravel.com/docs/5.8/eloquent-serialization
使用下面描述的方法将PostImage对象的每个字段(image_name1 .. image_name5)添加到JSON How to add attribute in JSON in PHP?
返回JSON
更新:
Post :: orderBy('id','DESC')-> get()-> first()返回一个对象。
Post :: orderBy('id','DESC')-> get()返回对象的集合,这将需要其他方法。
尝试一下:
$post = Post::orderBy('id', 'DESC')->get();
$post->map(function ($item, $key) {
$post_images = PostImage::where('post_id', $item->id)->get()->first();
$item->setAttribute('image_name1',$post_images->image_name1);
$item->setAttribute('image_name2',$post_images->image_name2);
$item->setAttribute('image_name3',$post_images->image_name3);
$item->setAttribute('image_name4',$post_images->image_name4);
$item->setAttribute('image_name5',$post_images->image_name5);
return $item;
});
return $this->successResponse($posts);
答案 2 :(得分:0)
您绝对可以串联两个JSON数组,您必须解析对象并将其串联并重新字符串化。
这个问题也可以在这里回答。 https://wkhtmltopdf.org/downloads.html