2010-05-06 2 views
3

CakePHP 1.3에는 virtual fields의 기능이 있지만 사용중인 데이터베이스와 결합되어 있습니다. 예 :CakePHP의 데이터베이스 불가지론 가상 필드

var $virtualFields = array(
    'full_name' => 'CONCAT(User.first_name, " ", User.last_name)' 
); 

이것은 MS SqlServer에서는 작동하지 않지만 MS SQL 서버에서는 작동하지 않습니다. 이 데이터베이스를 불가지론스럽게 만들 수있는 방법이 있습니까?

아직 응용 프로그램을 개발하는 중이며 아직 프로덕션 환경에서 어떤 데이터베이스를 사용할 지 아직 확실하지 않습니다. 그래서 나는 모든 데이터베이스 액세스를 가능한 불가지론 자로 유지하고자합니다.

답변

2

당신은 각 데이터베이스에 대한 규칙을 가지고 있도록 당신의 Model::virtualFields 속성을 치수 수 :

var $virtualFields = array(
    'mysql' => array(
     'display_name' => 'CONCAT(User.name, " (", User.team, ")")', 
    ), 
    'postgres' => array(
     'display_name' => 'PgConcatStuff(...)', 
    ), 
    'mssql' => array(
     'display_name' => 'MsConcatStuff(...)', 
    ), 
); 
트릭은 다음 케이크는 결코 실현되지 않으므로 위의 속성을 잡아 즉석에서이를 조작하는 것입니다

:

class AppModel extends Model { 

    function beforeFind($queryData) { 
     $ds = $this->getDataSource(); 
     $db = $ds->config['driver']; 
     $this->virtualFields = $this->virtualFields[$db]; 
     return parent::beforeFind($queryData); 
    } 

위의 코드는 단일 모델에서 간단한 찾기를 사용하여 테스트되었습니다. 관련 모델과 관련된 모서리 케이스를 확인하려면 더 많은 테스트가 필요할 수 있습니다. 완성 된 기능은 동작에 속합니다. :)

+0

좋은 생각. 'beforeFind' 대신에'__construct'가 더 좋은 장소가 될 것입니다. 특히 한 번만 실행하면됩니다. 어쨌든 +1하십시오. – deceze

+0

아, 좋은 지적이야. 또한 가상 필드가 설정으로 전달되는 경우에도 '시작'메소드에서 동작을 수행 할 수 있습니다. – deizel