You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:35:14