Eloquent:约束一个渴望的负载关系,其中relation属性为0或关系不存在

haa*_*kym 9 php laravel eloquent

我想获得的所有Report地方的关系模型ReportUpload中的财产status等于0 其中的ReportUpload关系不存在.在ReportReportUpload型号都具有一对一的关系,ReportUpload属于一个Report.

有点不确定如何使用雄辩的关系约束或任何其他方法来解决这个问题.任何帮助,将不胜感激.

这是我目前的代码:

// initial query

$reports = Report::whereHas('link', function($query) {
        $query->where('status', 'complete');
    })->with('student', 'course', 'institution', 'reportUpload');


// apply constraint

if ($request->has('uploadStatus')) {
    $uploadStatus = $request->has('uploadStatus'); // 0 or 1

    if ($uploadStatus === 0) {
        $reports = $reports
            ->whereDoesntHave('reportUpload')
            ->orWhereHas('reportUpload', function($query) use ($uploadStatus) {
                $query->where('status', $uploadStatus);
            });
    } else {
        $reports = $reports->whereHas('reportUpload', function($query) use ($uploadStatus) {
            $query->where('status', $uploadStatus);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

代码不会产生预期的结果.

编辑

尝试这种方法但不确定它是否正确:

$reports = $reports
    ->where(function ($query) use ($uploadStatus) {
        $query
            ->whereDoesntHave('reportUpload')
            ->orWhereHas('reportUpload', function($query) use ($uploadStatus) {
                $query->where('status', $uploadStatus);
            });
    });
Run Code Online (Sandbox Code Playgroud)

Blu*_*nie 6

首先,您的初始代码中存在一些错误.

1 - 您正在检查请求是否has为uploadStatus.然后,$uploadStatus == $request->has这将永远是true.

if ($request->has('uploadStatus')) {
    $uploadStatus = $request->has('uploadStatus');
Run Code Online (Sandbox Code Playgroud)

所以我想你可能想要:

if ($request->has('uploadStatus')) {
    $uploadStatus = $request->input('uploadStatus');
Run Code Online (Sandbox Code Playgroud)

2 - 你严格比较$uploadStatus === 0哪些可能不起作用,因为请求可能返回一个字符串'0'而不是一个整数,所以你应该比较==或转换$uploadStatus(int).

在此之后,我认为您在问题中添加的代码按预期工作:

$reports = $reports
->where(function ($query) use ($uploadStatus) {
    $query
        ->whereDoesntHave('reportUpload')
        ->orWhereHas('reportUpload', function($query) use ($uploadStatus) {
            $query->where('status', $uploadStatus);
        });
});
Run Code Online (Sandbox Code Playgroud)

因为where封装查询会将它放在括号之间.