mmeisson
mmeisson

Reputation: 683

One To Many + Many to many relationshipd alongside with Propel

I have two tables which have two different relations. A table User, and a Table Job for this example.

I wan't a One-To-Many relationship between them (a User can create Several Job), AND a Many-To-Many relationShip alongside (A User can be assigned several jobs, a Job can be assigned to several Users). I have a lot of troubles finding how to use phpName and refPhpName to avoid Propel trying to declare several time same methods / attributs ($collJobs in User table for example).

Here is a simplest sample of my Schema

    <table name="autoclass">
        <column name="userId" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
        <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>

        <foreign-key foreignTable="job" onDelete="cascade" onUpdate="cascade">
            <reference local="jobId" foreign="jobId"/>
        </foreign-key>
    </table>

    <table name="job">
        <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
        // Some other meaningless fields
    </table>

    <table name="user_job" crossRef="true">
        <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
        <column name="userId" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    
        <foreign-key foreignTable="job" onDelete="cascade" onUpdate="cascade">
            <reference local="jobId" foreign="jobId"/>
        </foreign-key>
        <foreign-key foreignTable="user" onDelete="cascade" onUpdate="cascade">
            <reference local="userId" foreign="userId"/>
        </foreign-key>
    </table>

Can you please help me find how to finallyse this schema ?

I would like to do something like $user->getJobs(); $user->getAssignedJobs(); $job->getUser(); $job->getAssignedUsers();

Upvotes: 0

Views: 48

Answers (1)

mmeisson
mmeisson

Reputation: 683

    <table name="autoclass">
        <column name="userId" phpName="Id" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
        <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>

        <foreign-key foreignTable="job" onDelete="cascade" onUpdate="cascade">
            <reference local="jobId" foreign="jobId"/>
        </foreign-key>
    </table>

    <table name="job">
        <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
        // Some other meaningless fields
    </table>

    <table name="user_job" crossRef="true">
        <column name="jobId" phpName="JobId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
        <column name="userId" phpName="UserId" type="INTEGER" primaryKey="true" autoIncrement="true" required="true"/>
    
        <foreign-key foreignTable="job" onDelete="cascade" onUpdate="cascade" phpName="AssignedJob">
            <reference local="jobId" foreign="jobId"/>
        </foreign-key>
        <foreign-key foreignTable="user" onDelete="cascade" onUpdate="cascade"phpName="AssignedUser" >
            <reference local="userId" foreign="userId"/>
        </foreign-key>
    </table>

Put phpName on foreign-keys :)

Upvotes: 0

Related Questions