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

调用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();
    }
}

错误原因

  1. 返回类型混淆:仓库findManyBy方法中,$query->get()返回的是Laravel Collection对象,你直接给它添加total属性($result['total'] = $totalData),虽然Collection支持数组式访问,但本质是对象而非关联数组。
  2. 控制器取值错误:控制器中尝试获取$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:35:20