2010-02-23 2 views
0

기술을 사용하여 확장 된 모델을 확장 : ORM, 교리 1.1.6, KohanaPHP교리 열 집계를

교리 1.1.6와 함께. 다른 테이블에 모델을 퍼뜨리는 방법은 무엇입니까?

자세한 상황 :

이 나는 ​​ID, 로그인 및 암호를 포함하고 하나 EMAILADDRESS, 많은 주소와 다른 관계가있는 클래스의 엔티티가 있습니다. 엔티티를 확장하는 두 개의 다른 클래스 인 Company와 Person이 있습니다. Column aggregation을 사용하여 확장하려면 모든 로그인 및 비밀번호 정보가 한 곳에서 저장됩니다. 이제 Person 클래스 (성, 성 등)에 특정 열을 추가하고 싶지만이를 수행하는 방법을 찾을 수 없습니다. 문서에서 제공하는 유일한 예는 추가 열이없는 것입니다.

현재 클래스

Entity 클래스 :

class Entity extends Doctrine_Record 
{ 
    public function setTableDefinition() { 
     $this->setTableName('entity'); 
     $this->hasColumn('id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'unsigned' => 0, 
      'primary' => true, 
      'autoincrement' => true, 
      )); 
     $this->hasColumn('login', 'string', 64, array(
      'type' => 'string', 
      'length' => 64, 
      'fixed' => false, 
      'primary' => false, 
      'notnull' => true, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('password', 'string', 64, array(
      'type' => 'string', 
      'length' => 64, 
      'fixed' => false, 
      'primary' => false, 
      'notnull' => true, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('created', 'date', null, array(
      'type' => 'date', 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('modified', 'date', null, array(
      'type' => 'date', 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
      )); 

     $this->setSubclasses(array(
       'Person' => array("type" => 1) 
      )); 
    } 
}

사람 클래스 :

class Person extends Entity 
{ 
    public function setTableDefinition() { 
     $this->setTableName('person'); 
     $this->hasColumn('id', 'integer', 4, array(
      'type' => 'integer', 
      'length' => 4, 
      'unsigned' => 0, 
      'primary' => true, 
      'autoincrement' => true, 
      )); 
     $this->hasColumn('firstname', 'string', 255, array(
      'type' => 'string', 
      'length' => 255, 
      'fixed' => false, 
      'primary' => false, 
      'notnull' => true, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('insertion', 'string', 64, array(
      'type' => 'string', 
      'length' => 64, 
      'fixed' => false, 
      'primary' => false, 
      'notnull' => false, 
      'autoincrement' => false, 
      )); 
     $this->hasColumn('lastname', 'string', 255, array(
      'type' => 'string', 
      'length' => 255, 
      'fixed' => false, 
      'primary' => false, 
      'notnull' => true, 
      'autoincrement' => false, 
      )); 
    } 
}

SQL 생성 :

CREATE TABLE `person` (
    `id` INT AUTO_INCREMENT, 
    `firstname` VARCHAR(255) NOT NULL, 
    `insertion` VARCHAR(64), 
    `lastname` VARCHAR(255) NOT NULL, 
    PRIMARY KEY(`id`) 
) ENGINE = INNODB 

CREATE TABLE `entity` (` 
    id` INT AUTO_INCREMENT, 
    `login` VARCHAR(64) NOT NULL, 
    `password` VARCHAR(64) NOT NULL, 
    `created` DATE, 
    `modified` DATE, 
    PRIMARY KEY(`id`) 
) ENGINE = INNODB

수 누군가 이걸 어떻게 할 수 있는지 말해줘?

답변

1

기본적으로 모든 항목이 동일한 테이블에 저장되므로이 열을 엔터티 클래스에 추가해야합니다. 즉,이 열은 회사 항목에서도 사용할 수 있지만 어쩌면 여기서 사용할 수는 없습니다.

그러나 다른 테이블을 사용하고 외래 키로 참조 할 수는 있습니다. 저장 모든 기관에 공통 기본 정보 -

  1. 기업 : 이것은 당신에게이 같은 레이아웃을 제공 할 것입니다. 또한이 엔티티 유형 (User, Company)을 ID로 저장합니다.
  2. entity_types은 - 정보를 저장 사용자와 해당 기업의 핵심에 특정 - 각 개체 유형
  3. 사용자에 대한 coreesponding 테이블을 저장합니다.
  4. 회사 - 추가 정보가없는 경우 사용자 같은이 거의 비어있을 수 있습니다
(이 솔루션을 구현하는 방법에 따라, 당신은 여전히 ​​단순에 대한 개체 ID를 포함하는 하나 개의 행을 추가 할 수 있습니다)

이 방법을 사용하면 엔티티에 대한 추가 정보를 평소에 (게으른) 가져올 수 있으며 테이블 자체가 슬림하게 유지됩니다. 엔티티가 컬럼 집계로 이해된다면 Doctrine은 올바른 객체를 반환 할 것입니다. 그런 다음 추가 정보를 가져 오기위한 사용자 지정 함수를 추가 할 수 있습니다.

당신은 2

+0

@Larry_Croft의 간접을 남길 수 있습니다 : 그러니까 기본적으로 내가 원하는 걸 할 수 없습니다? 나는 개인 정보와 회사 정보를 하나의 테이블에 둘 필요가 있습니까? –

+0

예, 적어도 열 집합과 관련 있습니다.내 대답에 대체 솔루션을 추가하겠습니다. –

+0

감사합니다. 당신은 나의 오래된 상황을 제안합니다 (아무런 모욕, 당신은 알 수 없습니다). 나는 너의 생각을 확장하려고 노력할 것 같다. 도와 주셔서 다시 한 번 감사드립니다! –