Laravel调用stdClass::isEmpty()报错,查询结果判空失败如何解决
问题原因分析
DB::table()->get()返回的是Illuminate\Support\Collection集合实例,只有集合本身才有isEmpty()、count()这类方法- 你在
@foreach中遍历得到的$pl1是集合中的单个元素,类型为stdClass普通对象,不存在isEmpty()方法,因此触发了Call to undefined method stdClass::isEmpty()报错
正确实现方案
你当前的代码加了@break只需要取第一条数据,完全不需要遍历,更推荐使用方案1,性能更高逻辑更清晰。
方案1:直接取单条数据(推荐)
控制器优化
将原代码末尾的->get()替换为->first(),直接返回单个stdClass对象,没有匹配数据时返回null:
$paperlist1 = DB::table('upload_papers') ->join('courselist','courselist.id', '=', 'upload_papers.courselist_id') ->join('users','users.id','=','upload_papers.upload_by') ->select('upload_papers.file_name','upload_papers.paper_no','upload_papers.path','users.role_id') ->where([ ['courselist.faculty_id','=',$facultyid], ['upload_papers.courselist_id','=',$id], ['upload_papers.paper_no','=',1] ]) ->first();
Blade代码优化
直接判断对象是否存在即可:
<tr> @if($paperlist1) @if($pl1->role_id === 2) <td><a href="/{{ $pl1->path }}">{{ $pl1->file_name }}</a></td> @else <td>-</td> @endif @if($pl1->role_id === 3) <td><a href="/{{ $pl1->path }}">{{ $pl1->file_name }}</a></td> @else <td>-</td> @endif @else <td>-</td> <td>-</td> @endif </tr>
方案2:保留原遍历逻辑的修正方式
把isEmpty()判断移到foreach外层,作用在集合实例上即可:
<tr> @if(!$paperlist1->isEmpty()) @foreach($paperlist1 as $pl1) @if($pl1->role_id === 2) <td><a href="/{{ $pl1->path }}">{{ $pl1->file_name }}</a></td> @else <td>-</td> @endif @if($pl1->role_id === 3) <td><a href="/{{ $pl1->path }}">{{ $pl1->file_name }}</a></td> @else <td>-</td> @endif @break @endforeach @else <td>-</td> <td>-</td> @endif </tr>
额外注意
如果需要判断单个$pl1对象的某个字段是否为空,直接使用empty($pl1->字段名)即可,不要调用普通对象不存在的方法。
内容的提问来源于stack exchange,提问作者user17298617
相关产品推荐
相关产品推荐

