Propel配置User与Job表一对多、多对多共存关系实现方法
Propel 配置User-Job双关联关系解决方案
问题原因
Propel默认根据关联目标表名生成模型的方法、属性名。同时配置两类指向User、Job表的关联时,若没有给不同关联设置独立的命名参数,就会生成重名的$collJobs属性、getJobs()方法,触发重复声明错误。
原Schema还存在两处结构问题:缺少独立的User表定义,Job表未设置承载「创建人」一对多关系的外键字段。
修正后完整Schema配置
<!-- 用户表 --> <table name="user" phpName="User"> <column name="userId" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/> <!-- 其余用户字段按需补充 --> </table> <!-- 任务表 --> <table name="job" phpName="Job"> <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/> <!-- 新增创建人外键字段,承载一对多创建关系 --> <column name="created_by" type="INTEGER" required="true"/> <!-- 其余任务字段按需补充 --> <!-- 一对多关联:一个用户可创建多个任务 --> <foreign-key foreignTable="user" onDelete="cascade" onUpdate="cascade" phpName="User" refPhpName="Jobs" > <reference local="created_by" foreign="userId"/> </foreign-key> </table> <!-- 多对多关联中间表:用户-任务分配关系 --> <table name="user_job" phpName="UserJob" crossRef="true"> <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" required="true"/> <column name="userId" phpName="Id" type="INTEGER" primaryKey="true" required="true"/> <foreign-key foreignTable="job" onDelete="cascade" onUpdate="cascade" phpName="AssignedJob" refPhpName="AssignedUsers" > <reference local="jobId" foreign="jobId"/> </foreign-key> <foreign-key foreignTable="user" onDelete="cascade" onUpdate="cascade" phpName="AssignedUser" refPhpName="AssignedJobs" > <reference local="userId" foreign="userId"/> </foreign-key> </table>
生成的方法对应效果
配置完成后重建模型,即可直接使用预期的调用方法:
$user->getJobs():获取当前用户创建的所有任务(一对多关系)$user->getAssignedJobs():获取当前用户被分配的所有任务(多对多关系)$job->getUser():获取当前任务的创建人(一对多关系)$job->getAssignedUsers():获取当前任务分配到的所有用户(多对多关系)
注意:重建模型前请先删除旧的生成类文件,避免旧文件残留引发报错。
内容的提问来源于stack exchange,提问作者mmeisson
相关产品推荐
相关产品推荐

