如何更改PHP中从MySQL查询返回的数据格式

时间:2018-08-23 19:50:09

标签: php mysql json laravel

因此,我在Laravel工作,并且具有以下API GET路由,该路由从数据库中返回包含文档及其类别的查询:

Route::get('documents', function() {
return DB::table('documents')
->join('documents_categories','documents_categories.documentCategoryID','=','documents.documentCategoryID')
->select('documentName','documentCategoryName')
->get(); });

哪个返回我所有按类别排序的文档:

{documentName: "Certificación de Licencia", documentCategoryName: "Aeronáutica Civil"}

{documentName: "Horas de Vuelo", documentCategoryName: "Aeronáutica Civil"}

{documentName: "Antecedente Penal", documentCategoryName: "Antecedentes"}

{documentName: "Traslado de Animales y Plantas", documentCategoryName: "Certificado de Sanidad Animal o Vegetal"}

{documentName: "Calidad y Apto para el Consumo Humano", documentCategoryName: "Certificados Comerciales"}

{documentName: "Certificado de Libre Venta", documentCategoryName: "Certificados Comerciales"}

{documentName: "Certificado de Origen", documentCategoryName: "Certificados Comerciales"}

{documentName: "Patente", documentCategoryName: "Certificados Comerciales"}

{documentName: "Registro de Producto", documentCategoryName: "Certificados Comerciales"}

{documentName: "Signos Distintivos", documentCategoryName: "Certificados Comerciales"}

现在,我要实现的是将文档类别作为JSON键返回,并在数组中返回相应的文档。像这样:

[
    {
        "Civiles":["document1","document2"],
        "Antecedentes":["document1","document2"]
    }
]

完成它的最好方法是什么? 谢谢大家的帮助!

3 个答案:

答案 0 :(得分:2)

如果您使用Laravel> = 5.3,则查询将返回collection

您可以混合使用groupBy()map()pluck()

Route::get('documents', function () {
    return DB::table('documents')
        ->join('documents_categories', 'documents_categories.documentCategoryID', '=', 'documents.documentCategoryID')
        ->select('documentName', 'documentCategoryName')
        ->get()
        ->groupBy('documentCategoryName')
        ->map(function ($item) {
            return $item->pluck('documentName');
        });
});

如果您使用的是Laravel 5.4,则可以更进一步,并通过更改以下内容来使用Higher Order Messages

->map(function ($item) {
    return $item->pluck('documentName');
});

收件人:

->map->pluck('documentName');

答案 1 :(得分:0)

对不起,我弄错了你的问题。我的错。谢谢@Rafael

编辑版本:

好吧,您可以在$documentList上使用Laravel的collect方法

$namelist = collect($documentList)->groupBy('documentCategoryName');

它将返回类似这样的内容。不是json格式。它将是数组格式。

$namelist = {
    category1: [
        {
            documentName: "d1",
            documentCategoryName: "category1"
        },
        {
            documentName: "D2",
            documentCategoryName: "category1"
        }
    ],
}

然后您可以遍历此数组

$res = array();
foreach ($namelist as $key => $value){
    array_push($res[$key], $value['documentname']);
}

并返回$res。这将是您想要的输出。

让我们知道您是否正在寻找这样的东西。

答案 2 :(得分:0)

在集合类上查看groupBy()的Laravel文档。

由于get()返回一个集合,因此您可以在最后链接此方法。

Route::get('documents', function() {
    return DB::table('documents')
        ->join('documents_categories','documents_categories.documentCategoryID','=','documents.documentCategoryID')
        ->select('documentName','documentCategoryName')
        ->get()
        ->groupBy('documentCategoryName');
});