flightPHP ActiveRecord关联配置异常:用户与角色表关联问题
Flight ActiveRecord 用户与角色关联配置问题
数据表结构
USERS ROLES ----------------------------- id id role_id name fname ... ...
问题场景
使用 flight\ActiveRecord 定义 Users 映射类时,我在构造函数里配置了如下关联:
function __construct($databaseConnection) { $this->relations = [ 'role' => [ self::HAS_ONE, \Main\Models\Roles::class, 'id' ] ]; parent::__construct($databaseConnection, 'users'); }
按照预期,执行 $user = $this->mapper->find(7); 后,应该能通过 $user->role->name 直接获取该用户的角色名称,但实际返回 NULL。只有手动执行以下代码才能拿到正确值:
$user = $this->mapper->find(7); $user->role->find($user->getData()['role_id'])->getData();
想确认是功能本身如此,还是我的配置有误?
问题原因与修正方案
你的关联配置存在两处错误:
- 关联类型错误:从表结构来看,
Users表通过role_id关联到Roles表的id,这属于BELONGS_TO关联(用户属于某个角色),而非你配置的HAS_ONE(该类型通常对应关联字段在关联表中的场景)。 - 外键参数错误:关联配置的第三个参数,需要指定当前模型(
Users)中存储关联ID的字段,也就是role_id,而不是关联模型(Roles)的主键id。
修正后的 Users 类构造函数代码:
function __construct($databaseConnection) { $this->relations = [ 'role' => [ self::BELONGS_TO, \Main\Models\Roles::class, 'role_id' ] ]; parent::__construct($databaseConnection, 'users'); }
修正后,执行 $user = $this->mapper->find(7); 即可直接通过 $user->role->name 获取角色名称。Flight ActiveRecord 默认是懒加载机制,当你访问 $user->role 时会自动触发关联查询,无需手动调用 find 和 getData。
内容的提问来源于stack exchange,提问作者Bius
相关产品推荐
相关产品推荐

