我在这里遇到一个问题,即前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()
的一个版本并在刀片中引用它,它将毫无错误地启动。
答案 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方法之一来解决此问题。