Lumen 5.7中自定义hasMany关联的API JSON输出方法问询
解决Lumen中API返回替换关联ID为用户名的问题
我来帮你搞定这个需求,咱们一步步来实现你想要的JSON输出:
1. 完善LogTransfer模型的关联关系
首先,你需要在LogTransfer模型中添加两个belongsTo关联,分别对应来源用户和目标用户,这样才能通过ID关联到对应的User记录:
// app/LogTransfer.php namespace App; use Illuminate\Database\Eloquent\Model; class LogTransfer extends Model { // 如果你的表名不是log_transfers,记得设置这个属性 protected $table = 'log_transfers'; // 关联来源用户(id_source 对应 user表的user_id) public function sourceUser() { return $this->belongsTo(User::class, 'id_source', 'user_id'); } // 关联目标用户(id_destination 对应 user表的user_id) public function destinationUser() { return $this->belongsTo(User::class, 'id_destination', 'user_id'); } }
另外,也可以检查下你User模型里的logTransferFrom关联,确保外键和本地键配置正确(避免关联错误):
// app/User.php public function logTransferFrom() { // 当前用户作为转账的接收方,所以关联LogTransfer的id_destination字段 return $this->hasMany(LogTransfer::class, 'id_destination', 'user_id'); }
2. 修改控制器查询并转换输出格式
接下来有两种常见的方式来处理输出转换,你可以选适合自己的:
方式一:直接在控制器中用map处理集合
这种方式简单直接,适合快速实现:
public function from(Request $request) { $logTransfer = Auth::user()->logTransferFrom() // 预加载关联,避免N+1查询问题,提升性能 ->with(['sourceUser', 'destinationUser']) ->get() // 遍历集合,转换为你需要的格式 ->map(function ($transfer) { return [ 'id_transfer' => $transfer->id, // 假设LogTransfer的主键是id,对应示例中的id_transfer 'source' => optional($transfer->sourceUser)->username ?? '未知用户', // 处理用户不存在的情况 'destination' => optional($transfer->destinationUser)->username ?? '未知用户', 'jumlah' => $transfer->jumlah, 'waktu' => $transfer->waktu, 'qrLog' => $transfer->qrLog, 'jenis' => $transfer->jenis, ]; }); return response()->json(['status' => 'success','result' => $logTransfer]); }
这里用了optional()辅助函数,避免因为关联用户被删除而抛出错误,非常实用。
方式二:使用Eloquent资源(更优雅的方式)
如果你的API有很多类似的格式转换需求,推荐用Eloquent资源来统一管理:
首先创建一个资源文件:
php artisan make:resource LogTransferResource
(如果Lumen没有这个命令,你可以手动在app/Http/Resources目录下创建文件)
然后编辑LogTransferResource.php:
// app/Http/Resources/LogTransferResource.php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\JsonResource; class LogTransferResource extends JsonResource { public function toArray($request) { return [ 'id_transfer' => $this->id, 'source' => optional($this->sourceUser)->username ?? '未知用户', 'destination' => optional($this->destinationUser)->username ?? '未知用户', 'jumlah' => $this->jumlah, 'waktu' => $this->waktu, 'qrLog' => $this->qrLog, 'jenis' => $this->jenis, ]; } }
最后修改控制器,用资源集合返回:
use App\Http\Resources\LogTransferResource; public function from(Request $request) { $logTransfer = Auth::user()->logTransferFrom() ->with(['sourceUser', 'destinationUser']) ->get(); return response()->json([ 'status' => 'success', 'result' => LogTransferResource::collection($logTransfer) ]); }
这样处理后,你的API就会返回你想要的JSON格式了,把id_source/id_destination替换成了对应的username,并重命名为source/destination。
内容的提问来源于stack exchange,提问作者Iko Hendarto Kurniawan
相关产品推荐
相关产品推荐

