调用Laravel接口报Undefined index: data错误排查求助
问题排查:Laravel中"Undefined index: data"错误
错误现象
调用端点 localhost/mika-api/public/v1/transaksi-pindah-jurusan/ 时,Postman返回如下错误:
{ "error": { "title": "Internal Server Error", "message": "Undefined index: data, in file D:\\Projects\\mika-api\\vendor\\illuminate\\support\\Collection.php at Line 1290" } }
相关代码
控制器代码
<?php namespace App\Http\Controllers; use App\UseCases\CollectionRequestModel; use App\UseCases\TransaksiPindahJurusan\GetTransaksiPindahJurusanInteractor; use Illuminate\Http\Request; class TransaksiPindahJurusanController extends Controller { private $getTransaksiPindahJurusan; public function __construct(GetTransaksiPindahJurusanInteractor $getTransaksiPindahJurusan) { $this->getTransaksiPindahJurusan = $getTransaksiPindahJurusan; } public function getCollection(Request $request) { $result = $this->getTransaksiPindahJurusan->getCollection(new CollectionRequestModel($request->all())); $total = $result['total']; unset($result['total']); $pagination = $this->getPagination($request, $total, $request->except(['limit', 'offset'])); return $this->jsonResponse200Collection($result['data'], $total, $pagination); } }
交互器代码
<?php namespace App\UseCases\TransaksiPindahJurusan; use App\Repositories\PMBP\TransaksiPindahJurusanRepository; use App\UseCases\CollectionRequestModel; class GetTransaksiPindahJurusanInteractor implements GetTransaksiPindahJurusanInterface { private $repoTransaksiPindahJurusan; public function __construct(TransaksiPindahJurusanRepository $repoTransaksiPindahJurusan) { $this->repoTransaksiPindahJurusan = $repoTransaksiPindahJurusan; } public function getCollection(CollectionRequestModel $request) { $result = $this->repoTransaksiPindahJurusan->findManyBy( ['*'], $request->getParameters(), $request->getOrderBy(), $request->getGroupBy(), $request->getLimit(), $request->getOffset() ); return $result; } }
接口代码
<?php namespace App\UseCases\TransaksiPindahJurusan; use App\UseCases\CollectionRequestModel; interface GetTransaksiPindahJurusanInterface { public function getCollection(CollectionRequestModel $request); }
仓库代码
<?php namespace App\Repositories\PMBP; use App\Repositories\BaseRepository; use Illuminate\Support\Facades\DB; class TransaksiPindahJurusanRepository extends BaseRepository { protected $tableName = 'pmbp.transaksi_pindah_jurusan'; public function findManyBy($selects = [], $parameters = [], $orders = [], $groups = [], $limit = null, $offset = null) { $query = $this->find($selects, $parameters, $orders, $groups); $totalData = $query->count(); $this->addlimit($query, $limit, $offset); $result = $query->get(); $result['total'] = $totalData; return $result; } public function find($selects = [], $parameters = [], $orders = [], $groups = []) { $query = DB::table($this->tableName)->select($selects); $this->addParameters($query, $this->tableName, $parameters); $this->addOrders($query, $this->tableName, $orders); $this->addGroups($query, $this->tableName, $groups); return $query; } public function findOneBy($selects = [], $parameters = []) { return $this->find($selects, $parameters)->first(); } }
错误原因
- 返回类型混淆:仓库
findManyBy方法中,$query->get()返回的是Laravel Collection对象,你直接给它添加total属性($result['total'] = $totalData),虽然Collection支持数组式访问,但本质是对象而非关联数组。 - 控制器取值错误:控制器中尝试获取
$result['data'],但仓库返回的Collection本身就是数据集合,不存在data这个键名——你错误假设返回结果是包含data和total的关联数组,但实际是附加了total属性的Collection。
修复方案
方案1:统一返回关联数组(推荐)
修改仓库findManyBy方法,将结果包装成标准的data+total结构:
public function findManyBy($selects = [], $parameters = [], $orders = [], $groups = [], $limit = null, $offset = null) { $query = $this->find($selects, $parameters, $orders, $groups); $totalData = $query->count(); $this->addlimit($query, $limit, $offset); return [ 'data' => $query->get()->toArray(), 'total' => $totalData ]; }
方案2:调整控制器适配Collection
如果不想修改仓库,直接在控制器中使用Collection对象:
public function getCollection(Request $request) { $result = $this->getTransaksiPindahJurusan->getCollection(new CollectionRequestModel($request->all())); $total = $result['total']; $data = $result; unset($result['total']); $pagination = $this->getPagination($request, $total, $request->except(['limit', 'offset'])); return $this->jsonResponse200Collection($data, $total, $pagination); }
内容的提问来源于stack exchange,提问作者Andikatama
相关产品推荐
相关产品推荐

