hasOne和belongsTo必须成对写在正确模型上,外键在哪张表hasOne就写在哪边;with()参数必须严格匹配方法名;外键或主键非id时需显式传三个参数;迁移中必须加unique()和索引,否则关联失效。
和
必须成对写在正确模型上,否则关联永远返回
,且不报错。
外键在哪张表,
就写在哪边
这是最容易翻车的第一步。Laravel 不靠“名字”判断关系,而靠外键物理位置。
如果
表里有
字段 →
写在
模型里(User “拥有” Profile)
如果
表里有
字段 →
就得写在
模型里(Profile “拥有” User,反向设计)
写反了不会报错,但
会是
,SQL 里 WHERE 条件查的是
而不是你实际的
不生效?检查方法名和大小写
是字符串匹配,不是自动推导。它只认你模型里定义的方法名,一个字母都不能错。
模型里写的是
→ 必须用
写成
、
或
都静默失败
关联属性访问(如
)会触发懒加载,但
不加,100 个用户就发 100 次 SQL
想查「有 profile 的用户」,要用
,不是
+ 空值判断
外键或主键不是
?三个参数一个都不能省
默认约定只适用于最简场景。只要字段名或主键名一变,就必须显式传参,否则正查能过、反查崩。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
:表示外键是
(在 profiles 表),本地主键是
(在 users 表)
:第二、三参数必须跟上面完全一致,否则
查不到
字段类型也要对齐:比如
是
,
也得是同类型,否则 MySQL 隐式转换会让关联失效
迁移里漏掉
,业务逻辑就不可控
一对一不是 PHP 层控制的,是数据库约束保证的。没加唯一索引,代码看着对,数据早乱了。
是标准写法
不加
,
可以成功执行多次,一个用户存多条 profile
这时
懒加载可能随机返回某一条(MySQL 无序),
只取第一条,行为不可预测
外键字段本身还要加索引:
,否则
会全表扫描
真正卡住人的往往不是语法,而是外键在哪个表、方法写在哪边、迁移有没有
这三件事——它们不报错,但让关联形同虚设。
hasOnebelongsTonullhasOneprofilesuser_idhasOneUserusersprofile_idhasOneProfile$user->profilenullprofile_iduser_idwith('profile')with()public function profile()with('profile')with('Profile')with('userProfile')with('profiles')$user->profilewith()whereHas('profile')with()idhasOne(Profile::class, 'owner_id', 'uid')owner_iduidbelongsTo(User::class, 'owner_id', 'uid')$profile->useruser_idBIGINT UNSIGNEDusers.idunique()$table->foreignId('user_id')->unique()->constrained()->onDelete('cascade');unique()$user->profile()->create()$user->profilewith('profile')$table->index('user_id')whereHas()unique()