Laravel可能出现分页问题?

时间:2019-01-04 20:32:33

标签: php laravel

我在这里遇到一个问题,即前10个结果中的某些功能工作正常,但是当我单击第二个分页时,或者如果我执行某种排序以使有问题的记录显示出来,则会导致问题。基本上,它是在同一表上显示另一个记录的请求,并且与其他记录一起使用。

我创建了不同的记录,如果它们在前10个结果中都可以正常工作,但是当我将它们更改为在分页符中断之后出现时,我遇到了同样的错误。否则,如果该字段为null,则可以正常工作。

它给我的错误是它看起来像是一个非对象,但是该代码可与其他所有选择了相同对象的类似记录一起使用。

错误

ErrorException (E_ERROR)
Trying to get property 'full_name' of non-object (View: resources/views/doctors/index.blade.php)

<td><?php echo e($doctors->where('id', $doctor->ffs_id)->first()->full_name); ?></td>

代码

@if ($doctor->ffs_id == null)
    <td></td>
@else
    <td>
        {{ $doctors->where('id', $doctor->ffs_id)->first()->full_name }}
    </td>
@endif

分页代码:刀片

{{ $doctors->appends([
    'search' => $search,
    'sortColumn' => $sortColumn,
    'sortDirection' => $sortDirection
])->links() }}

分页代码:控制器

// Searches, sorts, and filters
$approved = $request->approved;
$search = $request->search;
$sortColumn = ($request->sortColumn == null ? 'last_name' : $request->sortColumn);
$sortDirection = ($request->sortDirection == null ? 'asc' : $request->sortDirection);

$doctors = Doctor::
    when($search, function ($query) use ($search) {
        $query->where(function ($query) use ($search) {
            $query
                ->where('first_name', 'LIKE', '%' . $search . '%')
                ->orWhere('last_name', 'LIKE', '%' . $search . '%')
                ->orWhere('type', 'LIKE', '%' . $search . '%')
                ->orWhere('npi', 'LIKE', '%' . $search . '%')
                ->orWhere('license', 'LIKE', '%' . $search . '%')
                ->orWhere('dea', 'LIKE', '%' . $search . '%');
        });
    })
    ->when($approved, function ($query) use ($approved) {
        $query->where(function ($query) use ($approved) {
            $query->where('is_approved', $approved);
        });
    })
    ->orderBy($sortColumn, $sortDirection)
    ->paginate(10);

编辑:即使删除所有排序功能并尝试加载/doctors?page=2也会产生相同的错误。

编辑2:我已经确认这与在控制器中编写$doctors的方式有关。如果我创建Doctor::all()的一个版本并在刀片中引用它,它将毫无错误地启动。

1 个答案:

答案 0 :(得分:1)

您正在通过分页查询返回的$doctors的原始集合中搜索父Doctor记录。如果父级Doctor不在当前记录页面中,则“查询”结果将为空。

问题:您有100位医生,ID为#1-100。您正在获取第一页,因此$doctors将包含#1-10医生。 (一个简单的示例,无需搜索或进行任何操作,只需进行标准分页即可。)

2号医生的ffs_id值为39。因为您正在$doctors集合中查找ID为#39的Doctor,所以找不到它,因为$doctors仅包含#1-10。

因此,您对100%是正确的,因为问题出在$doctors的内容上。

解决方案::为此医生-医生关系创建一种雄辩的关系方法。这样的事情(根据您的应用程序的需要进行了调整):

public function ffs()
{
    return $this->belongsTo(\App\Doctor::class);
}

使用此关系来检索和引用结果中的父医生(此处使用optional的红糖从视图中删除@if支票):

<td>
    {{ optional($doctor->ffs)->full_name }}
</td>

这将直接在数据库中查询相关记录,而不是使用$doctors集合。

这时,我们将遇到名为the N+1 problem的事物,其中每个父Doctor请求将是一个单独的数据库查询。您可以使用Eager Loading方法之一来解决此问题。