Laravel Eloquent关联报错:Trying to get property 'title' of non-object
问题分析与解决思路
嘿,我来帮你捋捋这个问题!你遇到的Trying to get property 'title' of non-object错误,其实核心原因很可能比你想的更直接,咱们一步步拆解:
先抓最直接的原因:find(1)没找到数据
你说employee::first()->title能正常运行,但find(1)->title报错,这说明数据库里根本不存在emp_no=1的员工记录!find(1)返回了null,你自然没法访问null的title属性。
先验证这个点:
$employee = employee::find(1); dd($employee); // 看看输出是不是null
如果确实是null,那你只要换一个数据库里存在的emp_no值来测试,问题应该就解决了。
再确认你的主键配置是否真的生效
虽然你怀疑Laravel没识别到主键是emp_no,但从first()能正常关联的情况来看,配置大概率是对的,不过咱们可以再验证下:
$testEmp = employee::first(); dd($testEmp->getKeyName()); // 正常应该输出'emp_no'
如果输出是id,那才是主键配置的问题,这时候可以检查:
- 模型是不是正确继承了
Illuminate\Database\Eloquent\Model - 有没有其他代码(比如父类模型、Trait)偷偷覆盖了
$primaryKey属性
另外提个小建议:Laravel的模型类名建议首字母大写(比如Employee、Title),关联方法名用复数更贴合语义(一个员工有多个头衔,所以改成titles()),这样代码更规范,也能避免一些潜在的自动加载问题:
// Employee模型里的关联改成复数 public function titles() { return $this->hasMany('App\Title', 'emp_no'); } // 调用的时候就是$employee->titles
最后再排查复合主键的小细节
你的titles表用了复合主键,Laravel对复合主键的支持确实有限,但在这个belongsTo/hasMany的关联场景下,只要emp_no关联是对的,就不会有问题,不用太担心这个点。
内容的提问来源于stack exchange,提问作者Kasra GH
相关产品推荐
相关产品推荐

