2013-10-22 3 views
1

내 데이터베이스에는 user 테이블이 있습니다. 이 사용자 테이블에는 외래 키인 parent_user_iduser_class_id 사이의 여러 필드가 있으며 둘 다 기본 키의 일부가 아닙니다. 다음과 같이 내 BaseUser.php에서는 외부 키를 나열Propel이 일부 관계형 객체를 검색하기위한 함수를 만드는 이유는 무엇입니까?

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> 
+0

XML 스키마의 관련 부분 ('user' 및 관련 테이블의 일부)을 볼 수 있습니까? - 귀하의 질문에 그것을 편집하십시오. – halfer

+1

문제의 두 테이블이있는 schema.xml을 추가했습니다. – NobleUplift

답변

1

난 그냥 내 자신의 추진 환경에서 스키마를 생성하고 현재이이 것을 발견했습니다

/* @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이 원하는대로 이름을 붙이는 경향이 있습니다. 만족 스럽다면 스키마에서 제거 할 수 있습니다.

+0

효과가 있습니다! 고맙습니다. Propel은 역 엔지니어링 된 schema.xml을 사용하여 사용자 정의 편집 내용을 schema.xml에 병합하는 방법이 있었으면 좋겠습니다. XML을 통해 데이터베이스를 변경하고 싶습니다. – NobleUplift

+0

당신을 진심으로 환영합니다. XML에서 변경을 수행 한 다음 마이그레이션 기능을 사용하여 제어 된 방식으로 데이터베이스를 수정할 수 있습니다. 대부분의 ORM에서 표준 접근 방식이라고 생각합니다. 어떤면에서는 데이터베이스가 ORM의 속성이되며 ORM의 설정을 제어합니다. 이렇게하면 쉽게 사용할 수 있습니다. – halfer

+0

Well Hibernate (우리가 이전하는 것)는 스키마에 대한 사용자 정의 변경 파일을 가질 수있게하며 원하는만큼 여러 번 리버스 엔지니어링 할 수 있으므로 변경 사항이 손실되지 않습니다. – NobleUplift

관련 문제