You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:54:16