为什么Propel会创建用于检索某些关系对象的函数,但不是全部?

时间:2013-10-22 22:20:31

标签: php mysql pdo foreign-keys propel

在我的数据库中,我有一个user表。此用户表有几个字段,其中包括parent_user_iduser_class_id两个外键,它们都不是主键的一部分。在我的BaseUser.php中,它列出了外键,如下所示:

protected $aUserRelatedByUserParentId;
protected $aUserClass;

同样,我有getUserClass()setUserClass(),但我没有getUserParent()setUserParent()。相反,我有getUserParentId() and setUserParentId()。这是否有原因,如果是这样,我可以在schema.xml中覆盖它吗?这是:

<?xml version="1.0" encoding="utf-8"?>
<!--Autogenerated by PropelSchemaReverseTask class.-->
<database name="test" defaultIdMethod="native">
  <table name="user" phpName="User" idMethod="native">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" required="true"/>
    <column name="parent_user_id" phpName="ParentUserId" type="INTEGER" required="true"/>
    <column name="name" phpName="Name" type="VARCHAR" size="45" required="true"/>
    <column name="description" phpName="Description" type="VARCHAR" size="45" required="true"/>
    <column name="user_class_id" phpName="UserClassId" type="INTEGER" required="true"/>
    <foreign-key foreignTable="user_class" name="fk_user_class">
      <reference local="user_class_id" foreign="id"/>
    </foreign-key>
    <foreign-key foreignTable="user" name="fk_user_parent">
      <reference local="parent_user_id" foreign="id"/>
    </foreign-key>
    <index name="fk_user_parent_idx">
      <index-column name="parent_user_id"/>
    </index>
    <index name="fk_user_class_idx">
      <index-column name="user_class_id"/>
    </index>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
  <table name="user_class" phpName="UserClass" idMethod="native">
    <column name="id" phpName="Id" type="INTEGER" primaryKey="true" required="true"/>
    <column name="name" phpName="Name" type="VARCHAR" size="45" required="true"/>
    <column name="permissions" phpName="Permissions" type="VARCHAR" size="45" required="true"/>
    <vendor type="mysql">
      <parameter name="Engine" value="InnoDB"/>
    </vendor>
  </table>
</database>

1 个答案:

答案 0 :(得分:1)

我刚刚在自己的Propel环境中生成了你的架构,发现你现在应该有这个:

/* @var $user User */
$user = new User();
$user->getUserRelatedByParentUserId();
$user->getUserClass();

我注意到您在各个列上都有phpName个属性 - 我建议删除它们,因为您正在请求无论如何都要生成的默认值。

然而,你走在正确的轨道上 - 试试这个:

<foreign-key foreignTable="user" name="fk_user_parent" phpName="ParentUser">
  <reference local="parent_user_id" foreign="id"/>
</foreign-key>

我假设您对UserClass的默认关系名称感到满意,因此不会更改。但是,对于自我加入,我添加了一个自定义关系名称,该名称应该为您提供$user->getParentUser()

顺便说一下,我希望您使用FK定义上的name属性为约束提供自定义名称。如果你想控制它,这很好,但我倾向于让Propel按照自己的意愿命名。如果您对此感到满意,可以将其从架构中删除。