Laravel hasMany关联不加括号调用时无法返回关联数据问题
问题原因分析
- 核心原因:
City模型未正确配置主键类型属性。Laravel 模型默认主键类型为整型$keyType = 'int',你虽然在$casts中将id转为字符串类型,但预加载关联的键值匹配逻辑优先读取$keyType配置做类型转换。预加载时所有City的UUID主键会被强制转为整型,UUID字符串转整型的结果统一为0,自然无法匹配到citizens表中city_id为字符串UUID的关联记录。
而你动态调用$city->citizens()->get()时,会直接使用原始字符串形式的主键构造查询条件,不受$keyType预转换逻辑影响,因此可以正常返回数据。 - 次要触发原因:如果该问题之前运行正常突然出现,大概率是近期有框架版本升级操作,不同 Laravel 版本对
$casts和$keyType的优先级处理逻辑存在差异,之前未暴露的配置遗漏问题在版本升级后触发。 - 低概率原因:检查是否最近新增了作用于
Citizen模型的全局查询作用域,且该作用域在预加载阶段生效、动态查询阶段被跳过,不过从你提供的测试代码来看该可能性极低。
你可以开启SQL日志,打印City::with('citizens')->get()执行的关联查询语句,查看查询citizens时的city_id in绑定参数,如果参数全部为0即可完全确认是主键类型转换导致的问题。
修复方案
在City模型中补充主键类型配置即可:
class City extends Model { use Searchable; protected $table = 'cities'; public $incrementing = false; protected $keyType = 'string'; // 新增这一行配置 protected $perPage = 20; // 其余原有代码保持不变 }
内容的提问来源于stack exchange,提问作者TDk
相关产品推荐
相关产品推荐

