本文档介绍了在 Lumen 框架中,如何对分页后的结果集进行编辑,并添加来自其他表的数据关联。通过示例代码,演示了如何将关联的分类信息添加到商品数据中,并解决了在动态添加属性时遇到的“Creating default object from empty value”错误。
在构建 REST API 时,经常需要从数据库中获取数据,并对其进行处理后再返回。Lumen 提供了方便的分页功能,但有时我们需要在分页结果的基础上,添加来自其他表的数据,例如关联的分类信息。以下代码展示了如何实现这一目标,并避免常见的错误。
首先,使用 Lumen 的数据库查询构建器获取商品数据,并进行分页:
$products = DB::table('storeItems as i') ->where('i.B2BAvailable', '=', '1') ->select('i.title','i.EAN','i.vendor','i.productType','i.ID as productID','i.releaseDate',DB::raw('(CASE WHEN (i.releaseDate > NOW()) THEN 1 ELSE 0 END) AS announced')) ->orderBy('i.releaseDate', 'desc') ->paginate(100); //return response()->json($products); // 先注释掉,等数据处理完成后再返回
这段代码从 storeItems 表中查询数据,并根据 releaseDate 字段进行排序,然后进行分页,每页显示 100 条记录。
接下来,遍历分页后的结果集,并为每个商品添加分类信息。关键在于如何正确地将关联数据添加到 $product 对象中。
foreach($products as $product) { $genres = DB::table('sCategoryConnector as ggc') ->join('sCatGenre as gg','gg.ID','=','ggc.ID_sCatGenre') ->where('ggc.EAN', '=', DB::raw("'".$product->EAN."'")) ->select('gg.tag') ->orderBy('gg.ID', 'asc') ->get(); if (count($genres) > 0) { $product->genres = $genres; } } return response()->json($products);
这段代码首先根据商品的 EAN 码,从 sCategoryConnector 和 sCatGenre 表中查询相关的分类信息。如果找到分类信息,则直接将 $genres 数组赋值给 $product 对象的 genres 属性。
注意事项:
在原始代码中,尝试使用动态属性名的方式来添加分类信息,导致了 “Creating default object from empty value” 错误。这是因为 $product 对象是一个 StdClass 对象,直接使用 $product->genres->$propName = $genre->tag; 这种方式动态创建多层嵌套的属性,会导致 PHP 无法正确识别。
总结:
在 Lumen 中,可以通过遍历分页结果集,并使用数据库查询构建器获取关联数据,然后直接将关联数据赋值给结果集中的对象属性,实现对分页结果集的编辑和数据关联。避免使用动态属性名的方式来创建嵌套属性,可以直接将整个关联数组赋值给对象属性。
暂无评论内容