Laravel生成动态sitemap.xml报错:Trying to get property 'slug' of non-object
错误原因及解决方案
错误根源
报错Trying to get property 'slug' of non-object是因为部分Property记录没有关联有效的Category模型,导致$property->category返回null而非对象,此时访问->slug就会触发错误。
修复步骤
1. 预加载关联(优化性能+确保关联数据正确获取)
修改控制器中的查询代码,使用with('category')预加载关联模型,避免N+1查询问题,同时确保关联数据被正确加载:
// SitemapController.php $properties = Property::with('category')->latest()->get();
2. 视图中处理空关联情况
针对可能存在的空关联,有三种处理方式:
方式一:使用Laravel的optional辅助函数
自动处理null值,避免报错:
{{ optional($property->category)->slug }}
方式二:条件判断+默认值
明确判断关联是否存在,给空关联设置默认值:
@if($property->category) {{ $property->category->slug }} @else uncategorized @endif
方式三:PHP可选链(Laravel 8+支持)
利用PHP 8的可选链操作符简化代码:
{{ $property->category?->slug }}
3. 业务层面的根源修复(可选)
如果业务要求每个Property必须属于一个Category,建议:
- 在Property模型的
category关联中添加约束,确保数据完整性 - 在数据库层面给
category_id字段设置外键约束,并设置为非空
内容的提问来源于stack exchange,提问作者allan
相关产品推荐
相关产品推荐

