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')); }
修改说明:
- 移除了方法参数中的
JobDetail $company——默认模型绑定会按主键查询,不符合我们通过job_order_no关联的需求,手动查询更灵活。 - 新增
$mysqlData = JobDetail::where('job_order_no', $DocNo)->firstOrFail();:通过DocNo匹配MySQL的job_order_no字段,firstOrFail()会在无匹配记录时返回404,符合RESTful规范。 - 调整视图变量名为
apiData和mysqlData,明确区分数据来源,便于视图中调用展示。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

