Eloquent morphOne关联异常:可存储数据但无法正常检索
嗨,结合你给出的环境信息(Laravel 5.5.35、PHP 7.0、MySQL 5.7),咱们来捋捋可能导致一个方法能拿到头像、另一个返回null的原因:
字段/属性名不匹配
最常见的情况就是两个方法对应的字段名拼错了。比如存头像时用的是avatar字段,但返回null的方法里误写成了avatar_path或者avatars。你可以对比下两个方法里调用的数据库字段,同时检查Profile模型的$fillable数组有没有包含avatar字段——要是没加,存的时候字段值根本没写入数据库,自然拿不到。模型关联或查询的字段限制
如果两个获取方法一个是直接查询Profile模型,另一个是通过关联(比如User关联Profile)获取,那可能关联定义里加了select限制,没包含avatar字段。比如User模型里的关联方法写了:public function profile() { return $this->hasOne(Profile::class)->select(['id', 'user_id']); }这种情况下通过
$user->profile拿到的Profile实例就没有avatar字段,返回null是正常的。缓存未更新
要是其中一个方法用到了缓存,另一个没用到,就可能出现缓存的旧数据(存头像前的Profile数据)。比如某个方法里用了:Cache::remember('profile_' . $id, 3600, function () use ($id) { return Profile::find($id); });存完头像后缓存没清除,就会一直返回没有头像的旧数据。你可以执行
php artisan cache:clear清下缓存试试。自定义访问器的逻辑错误
如果两个获取方法是模型里的自定义访问器(比如getAvatarAttribute()和getAvatarUrlAttribute()),那可能后者的逻辑有问题。比如访问器里误判了字段值,或者拼写错了属性名:// 错误示例:拼错了属性名 public function getAvatarUrlAttribute() { return $this->attributes['avatars'] ? Storage::url($this->attributes['avatars']) : null; }这种情况下即使数据库里有值,访问器也会返回null。
数据库字段的存储验证
最后可以直接去MySQL里查对应的Profile记录,看看avatar字段有没有真实存储值。比如字段类型是varchar但长度不够,导致存的时候被截断;或者存头像的方法里忘记调用$profile->save(),根本没把字段值写入数据库。
内容的提问来源于stack exchange,提问作者user3841429

