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

Laravel中如何在同一页面展示API与MySQL数据库数据?

问题描述

我正在开发一个API与MySQL项目,部分数据存储在MySQL中,部分存储在API中。目前Controller的index函数与store函数运行正常,store函数中通过将请求的job_order_no作为API的DocNo,使二者值一致。现需实现:点击视图中的a标签跳转至详情页,通过DocNo(对应MySQL的job_order_no)同时获取API与MySQL的数据并展示在同一页面。请问如何修改视图的跳转链接,以及是否需要在show函数中添加查询语句来匹配API的DocNo与MySQL的job_order_no?

现有Controller(show函数)代码

public function show($DocNo,JobDetail $company)
{
    $client = new Client();
    $headers = [
        'Content-Type' => 'application/x-www-form-urlencoded'
    ];
    $options = [
        'form_params' => [
            'Username' => 'ADMIN',
            'Password' => 'ADMIN',
            'Token' => 'FK98DL...'
        ]
    ];
    $request = new Psr7Request('POST', 'http://example.com/authenticate', $headers);
    $res = $client->sendAsync($request, $options)->wait();
    $token = json_decode($res->getbody(),true);



    $client = new Client();
    $headers = [
        'Authorization' => $token,
        'Content-Type' => 'application/x-www-form-urlencoded'
    ];
    $options = [
        'form_params' => [
            'DocNo' => $DocNo
        ]
    ];
    $request = new Psr7Request('GET', 'http://example/api/SalesOrder/GetSalesOrder/', $headers);
    $res = $client->sendAsync($request, $options)->wait();
    $data = json_decode($res->getBody(),true);
    return view('api.auth.orders.show', compact('data','company'));
}

现有视图跳转代码

<td class="text-center"><a href="{{ route('orders.show', $item['DocNo']) }}"></a></td>

解决方案

一、视图跳转链接修改

现有跳转链接无需大幅修改,只要确保路由定义的参数名与控制器show方法的$DocNo参数一致即可。

如果你的路由是如下定义:

Route::get('/orders/{DocNo}', [OrderController::class, 'show'])->name('orders.show');

那当前视图代码完全可行——因为你在store环节已经让DocNo和job_order_no值一致,传递$item['DocNo']就能同时关联两边的数据。如果列表项中存储的是job_order_no,改成$item['job_order_no']也可以,结果完全相同。

二、show函数必须添加MySQL查询逻辑

当前show函数仅获取了API数据,没有查询MySQL中对应job_order_no的记录,必须新增查询逻辑来匹配关联数据,修改后的代码如下:

public function show($DocNo)
{
    // 保留原有API数据获取逻辑
    $client = new Client();
    $headers = [
        'Content-Type' => 'application/x-www-form-urlencoded'
    ];
    $options = [
        'form_params' => [
            'Username' => 'ADMIN',
            'Password' => 'ADMIN',
            'Token' => 'FK98DL...'
        ]
    ];
    $request = new Psr7Request('POST', 'http://example.com/authenticate', $headers);
    $res = $client->sendAsync($request, $options)->wait();
    $token = json_decode($res->getbody(),true);

    $client = new Client();
    $headers = [
        'Authorization' => $token,
        'Content-Type' => 'application/x-www-form-urlencoded'
    ];
    $options = [
        'form_params' => [
            'DocNo' => $DocNo
        ]
    ];
    $request = new Psr7Request('GET', 'http://example/api/SalesOrder/GetSalesOrder/', $headers);
    $res = $client->sendAsync($request, $options)->wait();
    $apiData = json_decode($res->getBody(),true);

    // 新增:通过DocNo匹配MySQL的job_order_no,获取对应数据
    $mysqlData = JobDetail::where('job_order_no', $DocNo)->firstOrFail();

    // 将两边数据传递到视图
    return view('api.auth.orders.show', compact('apiData', 'mysqlData'));
}

修改说明:

  1. 移除了方法参数中的JobDetail $company——默认模型绑定会按主键查询,不符合我们通过job_order_no关联的需求,手动查询更灵活。
  2. 新增$mysqlData = JobDetail::where('job_order_no', $DocNo)->firstOrFail();:通过DocNo匹配MySQL的job_order_no字段,firstOrFail()会在无匹配记录时返回404,符合RESTful规范。
  3. 调整视图变量名为apiData和mysqlData,明确区分数据来源,便于视图中调用展示。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:18:13