为啥我不能在 Laravel 上正确映射嵌套查询? “在 null 上调用成员函数 map()”显示为错误

Posted

技术标签:

【中文标题】为啥我不能在 Laravel 上正确映射嵌套查询? “在 null 上调用成员函数 map()”显示为错误【英文标题】:Why can't I properly map nested query on Laravel? "Call to a member function map() on null" shown as error为什么我不能在 Laravel 上正确映射嵌套查询? “在 null 上调用成员函数 map()”显示为错误 【发布时间】:2020-03-28 20:26:29 【问题描述】:

地图功能后确实无法获得所需的数据。我希望通过关系从 save_details 中获得信用、日期以及从 Saving_bills 中获得的 save_bill_number,但现在看起来我陷入了这个致命的问题。调用地图上的成员函数显示致命错误。我们将不胜感激。

这是关系:

public function savingBill()

    return $this->belongsTo(SavingBill::class);

这是我的控制器逻辑:

$savingDetails = SavingDetail::where('date', $request->date)
    ->with('savingBill')
    ->get()
    ->map(function ($savingDetail) 
        return [
            'credit' => $savingDetail->credit,
            'date' => $savingDetail->date,
            'saving_bill' => $savingDetail
                ->saving_bill
                ->map(function ($inner) 
                    return [
                        'saving_bill_number' => $inner->saving_bill_number
                    ];
                ) // If I put an semicolon here, IDK why error would be shown, hope nothing with the semicolon
        ];
    );

This is the error that I'm getting.Please check the image for the error.

I need to filter above mentioned data from here.

【问题讨论】:

请通过编辑将所有错误消息以及您的调试尝试添加到问题中 您可能在 db 中有一条记录,根据错误图像,它的关系为空。您可以尝试将 try catch 块代码放入 map 以了解它在哪里失败以及是什么情况。 先生,我目前在 db 中只有 3 个条目,两个表之间没有任何空条目。但我已将 save_bill_id 设置为 db 中的可为空值。这会是个问题吗?以及我如何尝试在地图中使用 Try Catch,但它给出了无法访问的语句作为错误。 【参考方案1】:

我不确定这些map() 中的哪一个实际上会引发错误,但我猜这是第二个遍历saving_bill 关系的错误。 您在 cmets 中说 saving_bill_id 可以为空。如果是这种情况,则关系也将为 null,并且没有 Collection 提供 map() 方法。

在假设这个变量总是被填充之前检查 null:

$savingDetails = SavingDetail::where('date', $request->date)
    ->with('savingBill')
    ->get()
    ->map(function ($savingDetail) 
        return [
            'credit' => $savingDetail->credit,
            'date' => $savingDetail->date,
            'saving_bill' => $savingDetail->saving_bill
                ? $savingDetail
                    ->saving_bill
                    ->map(function ($inner) 
                        return [
                            'saving_bill_number' => $inner->saving_bill_number
                        ];
                    )
                : null,
        ];
    );

【讨论】:

以上是关于为啥我不能在 Laravel 上正确映射嵌套查询? “在 null 上调用成员函数 map()”显示为错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用嵌套查询时不能引用用户定义的类型字段?

如何使用 Laravel 的查询构建器执行嵌套连接?

为啥嵌套循环在 laravel 中不起作用

创建 REST API 时使用 Laravel 嵌套动态资源控制器的正确方法

js代码嵌套问题,为啥外层定义的变量内层不能使用

为啥我不能在这样的字符串上替换字符?