Search code examples
phppropel

Duplicate fields in generated propel Base class


I have a propel shcema.xml:

    <?xml version="1.0" encoding="UTF-8"?>
<database name="issue-tracker" defaultIdMethod="native">
    <table name="user" phpName="User">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="username" type="varchar" size="32" required="true" />
        <column name="password" type="varchar" size="32" required="true"/>
        <unique>
            <unique-column name="username"/>
        </unique>   
    </table>
    <table name="issue" phpName="Issue">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="title" type="varchar" size="255" required="true" />
        <column name="description" type="varchar" size="200" required="true" phpName="Description"/>
        <column name="user_id" type="integer" required="true"/>
        <foreign-key foreignTable="user">
            <reference local="user_id" foreign="id"/>
        </foreign-key>
    </table>
    <table name="tag" phpName="Tag">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="title" type="varchar" size="255" required="true" />
        <unique>
            <unique-column name="title"/>
        </unique>   
    </table>
    <table name="issue_tag" isCrossRef="true" phpName="IssueTag">
        <column name="issue_id" type="integer" primaryKey="true"/>
        <column name="tag_id" type="integer" primaryKey="true"/>
        <foreign-key foreignTable="issue" onUpdate="CASCADE" onDelete="CASCADE">
            <reference local="issue_id" foreign="id"/>
        </foreign-key>
        <foreign-key foreignTable="tag" onUpdate="CASCADE" onDelete="CASCADE">
            <reference local="tag_id" foreign="id"/>
        </foreign-key>
    </table>
    <table name="user_issue" isCrossRef="true" phpName="UserIssue">
        <column name="user_id" type="integer" primaryKey="true"/>
        <column name="issue_id" type="integer" primaryKey="true"/>
        <foreign-key foreignTable="user" onUpdate="CASCADE" onDelete="CASCADE">
            <reference local="user_id" foreign="id"/>
        </foreign-key>
        <foreign-key foreignTable="issue" onUpdate="CASCADE" onDelete="CASCADE">
            <reference local="issue_id" foreign="id"/>
        </foreign-key>
        <unique>
            <unique-column name="issue_id"/>
        </unique>   
    </table>
</database>

When I run the propel generator, it generates duplicate fields in BaseUser.php

    protected $collIssues;
    protected $collIssuesPartial;

    protected $collIssues;

As you can see there are dublicate $collIssues field. If I remove the foreign key from the last table user_issue the problem disappears.

Can someone help me or at least explain, give me a hint how to fix this.

Thank you.


Solution

  • The problem is that Propel is adding a collection of issues from two different places, once from the foreign key in issue and one from the foreign key in user_issue. It's an easy fix, you just need to use the refPhpName attribute. Check the Propel docs for more on the foreign-key attribute.

    <table name="issue" phpName="Issue">
        <column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
        <column name="title" type="varchar" size="255" required="true" />
        <column name="description" type="varchar" size="200" required="true" phpName="Description"/>
        <column name="user_id" type="integer" required="true"/>
    
        <!-- notice the additional attributes below -->
        <foreign-key foreignTable="user" phpName="Creator" refPhpName="CreatedIssues">
            <reference local="user_id" foreign="id"/>
        </foreign-key>
    </table>
    

    Then in your code you access the Creator fields differently:

    $myIssues = $user->getCreatedissues();
    $creatorUser = $issue->getCreator();
    $issuesCreatedByUser = IssueQuery::create()
      ->filterByCreator($user)
      ->find();