从查询生成器返回特定的 JSON 格式

Posted

技术标签:

【中文标题】从查询生成器返回特定的 JSON 格式【英文标题】:Returning specific JSON format from Query Builder 【发布时间】:2017-12-18 03:50:37 【问题描述】:

我正在使用Query Builder 通过此查询从多个连接表中获取结果:

$products = DB::table('products as p')
              ->select(
                  'p.id',
                  'p.name',
                  'p.reference',
                  'p.price',
                  'i.path',
                  'i.name'
                )
              ->join('products_r_images as pri', 'pri.product_id', '=', 'p.id')
              ->join('images as i', 'i.id', '=', 'prd.image_id')
              ->get();

一个产品可以关联多张图片。

通过上面的查询,我得到了这个结果:

[
    
        id: 3,
        name: "Test",
        reference: "ref-test",
        price: 123,
        image_path: "product/product-3/",
        image_name: "product_1.jpg"
    ,
    
        id: 3,
        name: "Test",
        reference: "ref-test",
        price: 123,
        image_path: "product/product-3/",
        image_name: "product_2.jpg"
    
]

如您所见,两行是一种产品的退货,而我希望文档数据在一行中返回类似的东西:

[
    
        product_id: 3,
        name: "Test",
        reference: "ref-test",
        price: 123,
        image_path: "product/product-3/",
        image_name: 
        [
            "product_1.jpg", "product_2.jpg"
        ]
    
]

有没有办法直接用查询生成器来做,或者需要其他处理?

【问题讨论】:

您是否为这些表设置了Eloquent 模型? 是的,每张桌子我都设置好了 你设置好图片的关系了吗? 您的意思是 Product 模型中的函数返回 hasMany(App\Images) 吗?如果是,不,我没有,因为对于这个查询,我只使用Query Builder 公平 :) 仅供参考,关系将是 belongsToMany 而不是 hasMany 【参考方案1】:

如果您只想为此使用查询生成器,那么您应该能够:

$products = DB::table('products as p')
    ->select(
        'p.id',
        'p.name',
        'p.reference',
        'p.price',
        'i.path',
        'i.name'
    )
    ->join('products_r_images as pri', 'pri.product_id', '=', 'p.id')
    ->join('images as i', 'i.id', '=', 'prd.image_id')
    ->get()
    ->groupBy('id')
    ->map(function ($products) 

        $product = $products->first();
        $product->image_name = $products->pluck('image_name');

        return $product;
    );

希望这会有所帮助!

【讨论】:

感谢您的回答!但我有一个错误:Call to undefined method Illuminate\Database\Query\Builder::map() @Nenroz 你用的是什么版本的 Laravel? 我使用的是 Laravel 5.4 @Nenroz 您是否准确地复制了查询,即您仍然在groupBy()map() 之前调用get() 确实是问题,非常感谢您的帮助!

以上是关于从查询生成器返回特定的 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

asp页面从数据库查询结果后 怎么返回为json格式

如何从codeigniter中的模型生成json格式

使用 APEX_JSON 生成 JSON 文档

ASP怎样生成json格式?

java-生成任意格式的json数据

从 JSON Schema 生成 C# 类 [关闭]