2014-03-30 1 views
0

서로 관계가있는 두 개의 모델이 있습니다. 한 특정 메서드에서 다른 필드를 선택해야합니다, 나는 보통 하나의 필드를 끌어 오기위한 메서드를 만듭니다. 미래 필드가 변경되면 함수의 반환 만 변경해야합니다. 여기에 예제가 있습니다.각 테이블 필드 (모델)에 하나의 get 메소드

나는 현재 다음 사용

사용자 모델

function getUsername($user_id){ 
    $this->id = $user_id; 
    return $this->field('my_username_field'); 
} 

서버 모델

012 (이것은 단지 예입니다, 분명히 더 많은 필드를 얻을 수있다)
function getUserIdByServerId($server_id){ 
    $this->id = $server_id; 
    return $this->field('my_user_id_field'); 
} 
function getUsernameByServerId($server_id){ 
    $user_id = $this->getUserIdByServerId($server_id); 
    return $this->User->getUsername($user_id); 
} 

더 많은 필드를 가져 오려면 각 필드에 대해 하나의 메서드를 작성해야하기 때문에 다음과 같이 작성해야하는 코드가 많습니다. 모든 전화에 그의 이름을 다시 써야합니다. 더 좋은 방법은 무엇입니까?

+0

http://www.php.net/manual/en/language.oop5.overloading.php를 살펴보십시오. 그건 그렇고, 나는 CakePHP 사용자가 아니며 프레임 워크 특정 방법이있을 수 있습니다. –

+0

필드 이름을 변경하면 되겠습니까? 각 호출을 변경해야하며 각 필드에 대해 메소드를 설정하기가 쉽지 않습니까? –

+0

그래서 어느 쪽이 옳은가요? 복사 및 붙여 넣기 또는 각 단일 필드에 대한 기능을하는 것이 가장 좋습니다. 나는 단지 뚱뚱한 클래스 (모델)을 가질 것이지만 유지 보수는 더 쉽다. –

답변

0

이렇게하려면 모델에 새 메서드를 만들 필요가 없습니다.

$this->Server->id = $server_id; 
$username = $this->Server->getUsernameByServerId($this->Server->id); 

난 당신이 할 수 있다고 생각 뭐, 그래도 그냥이 같은 것을 호출된다 :

$this->Server->id = $server_id; 
$username = $this->Server->User->field('username'); 
당신이 지금하고있는 것, 내가 당신의 서버 컨트롤러에 생각하면이 같은 것

아니면이있는 경우 (내가 생각하는) PHP 5.4 이상은 사용

$this->Server->id = $server_id; 
$username = $this->Server->read()['User']['username']; 

(PHP < 5.4 당신이 두으로 마지막 줄 것을 분할 할 수 있습니다).

이 경우 모델에 많은 메소드를 복사하여 붙여 넣어야한다고 생각하지 않습니다.

+0

하지만 필드 이름은 어떻게 변경됩니까? 나는 그 모든 부름에서 그것을 바꿔야한다, 그렇지? 그러나 그것이 옳은 일이라면, 나는 그것을 할 것입니다. –

+0

그래, 그냥 배열의 다른 색인에서 값을 반환합니다.Cake에는 이미 데이터베이스를 검색하기위한 모델에 대한 메서드가 있으므로 컨트롤러에서 원하는 것을 얻으려면 항상'read()'또는'find()'를 사용할 수 있어야하고 모델에서 다른 메서드를 만드는 것은 이것에 과잉. – SharkofMirkwood

1

왜 단일 필드를 가져 오시겠습니까? 특히 둘 이상이 필요한 경우? 이 doesnt는 다량 이해된다. 전체 레코드 (모든 필드를 필요로하거나 3-4를 선택)를 가져온 다음 DB에 대한 여러 쿼리를 수행하는 대신 데이터를 처리하는 것이 더 효과적입니다. 이는 비효율적이며 반복적 인 것이며 너무 건조하지는 않습니다.

CakePHP는 이미 그 방법 인 Model::field()을 제공합니다.

하지만 제가 말씀 드린 것처럼, 왜이 일을하는 것이 아닙니다.

$this->Server->find('first', array(
    'contain' => array(
     'User' 
    ), 
    'conditions' => array(
     'User.server_id' => $serverId 
    ) 
)); 
관련 문제