You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10中如何从查询结果生成含嵌套creator对象的JSON?

如何在Laravel查询中生成嵌套的creator对象?

你期望返回的JSON结构如下:

{
        "title": "Nueva noticia",
        "category": "Deportes",
        "body": "Nueva noticia de deportes",
        "image_name": "Imagen",
        "publication_date": "2024-02-16 00:00:00",
        "id": 1,
        "creator":{
           "name": "Benjamin Camacho",
          "email": "benjamin.camacho@email.com"
         }
}

你尝试用SQL别名(比如creator::name、creator/email)来生成嵌套对象,但这种方式行不通——SQL查询返回的是扁平结果集,没法直接生成嵌套结构。下面提供两种可行的解决方法:

方法一:用集合map手动转换结构

使用查询构建器获取扁平结果后,通过map方法遍历集合,手动构建嵌套的creator对象:

$noticias = DB::table('blogs')
            ->leftJoin('category', 'blogs.category_id', '=', 'category.id')
            ->leftJoin('users', 'blogs.user_id', '=', 'users.id')
            ->select(
                'blogs.title',
                'category.name as category',
                'blogs.body',
                'blogs.image_name',
                'blogs.publication_date',
                'blogs.id',
                'users.name as creator_name',
                'users.email as creator_email'
            )
            ->get()
            ->map(function ($item) {
                return [
                    'title' => $item->title,
                    'category' => $item->category,
                    'body' => $item->body,
                    'image_name' => $item->image_name,
                    'publication_date' => $item->publication_date,
                    'id' => $item->id,
                    'creator' => [
                        'name' => $item->creator_name,
                        'email' => $item->creator_email
                    ]
                ];
            });

return $noticias;

方法二:使用Eloquent关联(推荐)

如果你的项目使用Eloquent模型,先在Blog模型中定义关联关系:

// app/Models/Blog.php
public function creator()
{
    return $this->belongsTo(User::class, 'user_id');
}

public function category()
{
    return $this->belongsTo(Category::class);
}

然后通过with预加载关联数据,再整理成目标结构:

$noticias = Blog::with(['creator:id,name,email', 'category:id,name'])
            ->select('title', 'body', 'image_name', 'publication_date', 'id', 'category_id', 'user_id')
            ->get()
            ->map(function ($blog) {
                return [
                    'title' => $blog->title,
                    'category' => $blog->category->name,
                    'body' => $blog->body,
                    'image_name' => $blog->image_name,
                    'publication_date' => $blog->publication_date,
                    'id' => $blog->id,
                    'creator' => [
                        'name' => $blog->creator->name,
                        'email' => $blog->creator->email
                    ]
                ];
            });

return $noticias;

这种方式更符合Laravel的开发规范,代码可读性和可维护性更强。

内容的提问来源于stack exchange,提问作者Benjamín Camacho Castro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:03:11