2011-10-01 3 views
0

현재 mvc 프레임 워크 (PHP)에서 작업 중입니다. 나는 cakePHP가 "belongsTo"와 "hasMany"기능을 사용할 수있는 능력이 있다는 것을 알았다. 내 기능을 만들려고하는데 문제가 발생했습니다."hasMany"및 "belongsTo"모델을 만드는 방법은 무엇입니까? (cakePHP와 같음)

약속 테이블 (id, where, date, year_id)과 연도 테이블 (id, year)이 있다고 가정 해 보겠습니다. 나는이 예제가 문제없이 하나의 테이블로 수행 될 수 있음을 알고 있지만, 단지 예일 뿐이다.

class appointment_model extends model{ 
    public $_belongs_to= array('table'=>'year','field_connector'=>'year_id'); 
    public $one_value; 
} 

......

class year_model extends model{ 
    public $_has_many= array('table'=>'appointment','field_connector'=>'year_id'); 
    public $many_values; 
} 

....

class model{ 

private function select($query=null){ 
    if(!$query)die("Query cannot be null. Line num: " . __LINE__); 
    $results = $this->_db->mysql_select($query); 
    if(count($results)==1){ 
     $one = $this->initialize($results[0]); 
     $this->_do_for_other_tables($one); 
     return $one; 
    }elseif(count($results)>1){ 
     $returns = array(); 
     foreach($results as $result){ 
      $one = $this->initialize($result); 
      $returns[] = $this->_do_for_other_tables($one);  
     } 
     return $returns; 
    }else{ 
     return null; 
    } 

} 


private function _do_for_other_tables(&$one, $rec=1){ 


    if(property_exists($this, 'many_values')){ 
     if(!empty($one->many_values))return; 
     $many = functions::load_model($this->_has_many["table"]); 
     $res = $many->find_by($this->_has_many["field_connector"], $one->id); 
     $one->many_values = $res; 
    } 
    elseif(property_exists($this, 'one_value')){ 
     if(!empty($one->_belongs_to))return; 
     $only_one = functions::load_model($this->_belongs_to["table"]); 
     $field = $this->_belongs_to['field_connector']; 
     $res = $only_one->find_by('id', $one->$field); 
     $one->one_value = $res; 
    } 

} 

} 

기본적으로 여기에서 발생하는 나는 무한 루프에 들어갈 것입니다. 어떤 제안이라도 어떻게 고칠 수 있습니까? 더 설명해야한다면 그냥 말하십시오.

감사합니다. :).

+0

왜 다시 바퀴를 다시 만들었습니까? 교리는 그걸 상자에서 꺼내! – Francesco

+2

@Francesco : 다른 사람들도 그렇게하지 않는 방식으로 작동하는 방식을 알고 싶지 않기 때문이 아닙니다. 나는 그들 모두가 나의 것에 적합하지 않았기 때문에 내 요구에 맞는 프레임 워크를 직접 만들었다. 여기 Vizualni에 대해서도 똑같이 ... –

답변

1

"hasMany", "belongsTo", "hasOne"등의 속성을 2way 관계로 처리하는 대신 간단한 속성으로 취급하는 것이 문제입니다. 많은 고유 한 프레임 워크에서 프로그래머가 손으로 이러한 속성을 초기화하는 것이지만 클래스가 초기화 될 때 이러한 속성을 확인하고 두 속성을 함께 연결하는 단일 개체를 생성합니다.

System_DB_Relationship 개체와 같은 클래스를 만들고 동일한 복사본을 두 초기화 된 모델에 배치합니다. 모델을 팩토리 디자인 패턴으로 인스턴스화하지 않으면 고정 $ 관계 모델을 사용하여 관계를 저장할 수도 있습니다. 나는 이것을 Factory/Active 기록으로 관리하는 편이 낫다. 이제는 모델 기본 클래스의 논리에 따라 관계에 플래그를 배치하여 "이 관계가 사용되었습니다"라고 말하면서 다시 전달하지 않아도됩니다.

또 다른 방법은 항상 내림차순으로 작업하는 것입니다. 즉, 발견되었을 때 hasMany를 무시하고 하위 요소를로드하지만 모든 belongsTo를로드하여 부모가 기본적으로로드되도록 프록시 메소드 만 작성하십시오. 이 방법은 많은 클래스가있는 경우 위험 할 수 있습니다. 따라서 프레임 워크에서 구현하는 것은 대개 X 수준의 관계로드라는로드 매개 변수입니다. 그리고 hasMany가 필요하면 __call()을 사용하여 "$ myobject-> subobjects()"에 대한 호출을 가로 채서 즉시로드합니다.

수 많은 방법이 있지만 손쉽게 코드를 추적하고 이해할 수없는 것을보고 물건을 시험해보고 결국에는 어떤 것을 얻을 수 있습니다. 그러나 프란체스코가 말했듯이, 한 번에 변형 될 수없는 정말로 오래된 프로젝트로 작업하지 않는 한 휠을 재발 명하는 것은 거의 불가능합니다. 당신이하고있는 일을 더 잘하고 후드에서 어떻게 작동하는지 알 수 있습니다 ...

+0

답장을 보내 주셔서 감사합니다. 내 모델 클래스의 60 %와 같이 변경하여 두 개의 선택된 테이블에서 MySQL select 쿼리를 사용할 수있었습니다. 그렇게하는 것이 훨씬 더 쉬웠습니다. 당신의 대답은 정말 도움이되었습니다. 고맙습니다. – Vizualni

+1

답을 체크 표시로 표시해 주실 수 있습니까? 고맙습니다. 그것은 내가 욕심이 아니야, 그냥 stackoverflow에서 작동하도록되어있는 방법이며, 답변으로 게시물을 표시하지 않으면, 당신은 수용 점수를 낮추십시오 ... –