从查询生成器返回特定的 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 格式的主要内容,如果未能解决你的问题,请参考以下文章