Laravel 8项目排序时触发报错:Attempt to read property 'photo' on bool
问题分析与修复
核心问题
1. 控制器变量名覆盖
你在控制器中初始化$studios为Studio模型的集合,但在内部foreach循环里,又用同一个变量名接收Studios::findOrFail()的返回结果,直接覆盖了原本的集合。当启用排序功能时,循环逻辑被完整执行,最终传递给视图的$studios不再是集合,而是单个模型实例(甚至可能因查询问题返回异常/布尔值),导致Blade模板遍历出错。
2. Blade循环变量名冲突
模板中@foreach($studios as $studios)的写法会导致循环过程中变量被覆盖:第一次迭代后,$studios会从集合变成单个模型实例,后续迭代会尝试遍历该模型的属性,进而触发「Attempt to read property 'photo' on bool」错误。
修复步骤
1. 修正控制器变量名
将内部循环中的$studios变量名改为$studio,避免覆盖集合:
public function index(Request $request) { $bookings = []; $studios = Studios::where('status', 1)->get(); foreach ($this->sources as $source) { $models = $source['model']::where('status', '0')->get(); foreach ($models as $model) { $crudFieldValue = $model->getOriginal($source['date_field']); $crudFieldValueTo = $model->getOriginal($source['date_field_to']); // 修改变量名为$studio,避免覆盖集合 $studio = Studios::findOrFail($model->getOriginal($source['names'])); $user = User::findOrFail($model->getOriginal($source['field'])); $timeBreak = \Carbon\Carbon::parse($crudFieldValueTo)->format('H:i'); if (!$crudFieldValue && $crudFieldValueTo) { continue; } $bookings[] = [ // 对应修改为$studio->names 'title' => trim($source['prefix'] . "($studio->names)" . $user->name . " " ). " " . $timeBreak, 'start' => $crudFieldValue, 'end' => $crudFieldValueTo, ]; } } return view('welcome', compact('studios', 'bookings')); }
2. 修正Blade模板循环变量
将循环变量名改为$studio,并更新所有相关调用:
<div class="row"> @foreach($studios as $studio) <div class="col-lg-4 mb-5"> <div class="card" style="width: 18rem;"> @if($studio->photo) <img src="{{ $studio->photo->getUrl() }}" class="card-img-top" alt="..."> @endif <div class="card-body"> <h5 class="card-title">Nomer studio : {{ $studio->names }}</h5> <p class="card-text">Harga : Rp{{ number_format($studio->price,2,',','.') }} / Jam</p> <p class="card-text"> Rp{{ number_format($studio->org,2,',','.') }} / Orang</p> <a href="{{ route('booking', ['studio' => $studio->names]) }}" class="btn btn-primary">Booking</a> </div> </div> </div> @endforeach </div>
额外优化建议
- 避免在循环内执行数据库查询(如
Studios::findOrFail()、User::findOrFail()),可通过预加载或批量查询提升性能。 - 启用排序时,检查排序逻辑是否影响了
$models的结果,确保$model->getOriginal($source['names'])的取值始终有效,避免findOrFail触发异常。
内容的提问来源于stack exchange,提问作者Ilham
相关产品推荐
相关产品推荐

