Laravel 5.5中检查会员ID匹配时如何避免非对象错误?
解决Laravel 5.5中嵌套关联属性访问的报错问题
这个场景我太熟悉了!在处理嵌套关联的属性判断时,只要中间某一层关联不存在,直接访问下一层属性就会抛出那个烦人的“trying to get property of a non-object”错误。你完全不用单独写一堆if去逐个检查关联是否存在,Laravel本身就提供了优雅的方法把检查和判断逻辑合并在一起,给你两种实用方案:
方案一:使用optional()助手函数(最直接)
Laravel 5.5已经内置了optional()助手,它可以帮你安全地访问嵌套对象的属性——哪怕中间某一层是null,也不会报错,而是返回null。把你的判断逻辑改成这样就行:
if (optional(optional($profile->user)->membership)->id === optional($user->membership)->id) { // 校验通过后的业务逻辑 }
简单解释下:
optional($profile->user)会确保如果$profile->user不存在,后续访问membership时不会报错,而是返回null- 再套一层
optional(),就能安全访问id属性,不存在的话返回null - 右边的
optional($user->membership)->id同理,这样两边的比较就不会触发报错
方案二:给关联设置默认空模型(全局优雅)
如果你的代码里经常需要访问User的membership关联,那可以在模型里给关联加上withDefault()方法,让它在没有关联数据时返回一个空的Membership模型实例,而不是null:
在User模型的membership关联方法里修改:
public function membership() { return $this->belongsTo(Membership::class)->withDefault(); }
这样一来,你原来的判断逻辑可以完全不变,直接用就行:
if ($profile->user->membership->id === $user->membership->id) { // 校验逻辑 }
因为哪怕没有会员关系,membership返回的也是空模型,访问id会得到null(如果你的id字段允许为空),不会触发报错。
两种方案各有侧重:optional()适合临时处理个别判断场景,withDefault()适合全局统一处理关联的默认值,根据你的实际需求选就行~
内容的提问来源于stack exchange,提问作者fightstarr20
相关产品推荐
相关产品推荐

