Laravel 8 foreach循环返回空但数据表存在数据问题求助
问题排查方案
1. 校验关联外键配置
- Laravel
hasMany关联默认外键规则是「当前模型名_id」,你的Merchadise模型对应默认外键为merchadise_id,请检查Productattribute表的关联外键是否和规则匹配,如果是自定义外键需要手动指定关联参数:
public function merchadiseattributes() { // 第二个参数为Productattribute表的外键名,第三个参数为Merchadise表的主键名 return $this->hasMany(Productattribute::class, '自定义外键名', 'Merchadise表主键名'); }
- 同时检查两张表关联字段的类型、字符集是否完全一致,比如都是
int unsigned类型,字段类型不匹配会导致关联查不到数据。
2. 确认关联数据是否存在
在控制器中增加调试代码,先确认关联是否能成功取出数据:
public function show($id) { $merchadisedata=Merchadise::find($id); // 调试用代码,确认数据后可删除 dd($merchadisedata->merchadiseattributes); return view('backend.merchadise.productattributes')->with(compact('merchadisedata')); }
如果输出为空集合,说明是关联逻辑配置问题;如果能正常输出数据,则是模板端的问题。
3. 排查模板渲染问题
- 你模板中写的
{{ $attribute->merchads->merch_name }}需要先确认Productattribute模型是否定义了名为merchads的反向关联到Merchadise模型,未定义会导致页面报错空白。而且商品名你已经通过父模型拿到了,可以直接在循环外输出{{ $merchadisedata->merch_name }},不需要在循环里反向查询,既降低性能又容易出错。 - 可以在循环前增加空数据判断,避免无数据时页面空白:
<tbody> @if($merchadisedata->merchadiseattributes->isEmpty()) <tr><td colspan="6">当前商品暂未配置关联属性</td></tr> @else @foreach ( $merchadisedata->merchadiseattributes as $attribute) <tr> <!-- 商品名可以直接用父模型数据 --> <td>{{ $merchadisedata->merch_name }}</td> <td>{{ $attribute->productattr_size}}</td> <td>{{ $attribute->productattr_stock }}</td> <td>{{ $attribute->productattr_price}}</td> <td>{{ $attribute->productattr_sku }}</td> <td>{{ $attribute->productattr_status}}</td> </tr> @endforeach @endif </tbody>
- 确认项目
.env文件中APP_DEBUG=true开启调试模式,有报错会直接在页面展示,方便定位具体问题。
4. 可选性能优化
控制器查询商品时使用预加载,避免关联查询产生N+1性能问题:
$merchadisedata=Merchadise::with('merchadiseattributes')->find($id);
内容的提问来源于stack exchange,提问作者stephen waweru99
相关产品推荐
相关产品推荐

