2011-10-16 2 views
0

CodeIgniter 응용 프로그램에서 ORM을 구현하려고하는데 작동하지 않습니다. 난 그냥 간단한 테스트 모델의 인스턴스를 시도하고 시작하려면 :CodeIgniter에서 DataMapper를 사용할 수 없습니다.

public function __construct() 
{ 
    parent::__construct(); 
    $this->load->model('cart'); 
} 

public function index() 
{ 

    $cart = new Cart(); 
} 

하지만 난 생성자 번번이 않습니다

<?php 

class Cart extends DataMapper 
{ 

    public function __construct() 
    { 
     // model constructor 
     parent::__construct(); 
    } 

    var $validation = array(
     'username' => array(
      'label' => 'UserName', 
      'rules' => array('required', 'trim', 'unique', 'alpha_dash', 'min_length' => 1, 'max_length' => 50), 
     ) 
    ); 
} 

?> 

그리고를 다음 컨트롤러에서 나는이 시도. 디버거가 멈추고 "ide key xxxxx로 들어오는 연결 대기 중"이라는 메시지가 나타납니다. (임의 번호)

BTW 카트 모델 클래스 파일 이름은 소문자이지만 클래스 이름은 대문자입니다. 나는 생성자에서 둘 다 시도했다.

2 datamapper 파일을 라이브러리 및 구성 폴더에 복사하고 datamapper 라이브러리를 자동로드하는 방법은 설치 지침을 따라야합니다.

하지만 작동하지 않습니다. 내가 놓친 게 있니? 내가 매핑하려고하는 테이블은 실제로 id 및 username 필드 만있는 테스트 테이블입니다. 실제로 유효성 검사 배열을 이해하지 못했지만, 문서의 예제를 따라하고 내 필드를 수정했습니다. id 필드는 누군가가 유효성 검사 배열에 넣은 것처럼 보이지 않습니다.

내가 CodeIgniter의 초보자라는 것을 언급해야합니다.

답변

2

으로 변경해야합니다. 대부분 DataMapper ORM 및 CodeIgniter와 함께 사용하기에 적합합니다.

DataMapper는 단순한 추상화 계층 일뿐입니다. 데이터베이스로 작업하고 개체를 테이블에 매핑 할 때 많은 필수 요소를 처리합니다. 즉, 모델 등을로드 할 필요가 없습니다. 데이터베이스 라이브러리와 datamapper 라이브러리를 자동로드하는 한 DataMapper를 사용할 수 있습니다.

유효성 검사 배열을 사용하면 DataMapper가 등록 정보의 요구 사항을 알 수 있습니다. 당신은 객체와 사용자가 만든 속성 중 하나를 저장하려고한다면,/다음이 실패 저장, 이러한 요구 사항을 충족하지 않는 변경과 오류 메시지가 나타납니다 :

// For example 
if ($myObj->save()) 
{ 
    // $myObj validation passed and is saved to db 
} 
else 
{ 
    // $myObj validation failed, save did not complete 
    echo $myObj->error->string; 
} 

CodeIgniter의 Cart 라이브러리가 이미 있으므로 모델 이름을 Cart으로 지정하고 싶지 않습니다. 따라서 해당 모델의 이름을 Basket 또는 다른 의미로 바꿀 수 있습니다.

나는 아직도 일을 시작하려고 노력하고 있지만, 데이터 구조에 대해 조금 생각해야한다고 생각합니다. 을 Cart 개체에 저장하지 않으므로 관계를 사용합니다.그래서, 다음과 같이 약간 구조화합니다 :

// baskets table (a table represents many baskets, therefore it is plural) 
id 
user_id 
blah 
blah 
created 
updated 

// users table 
id 
username 
email_address 
created 
updated 

// basket model (a model represents 1 basket, therefore it is singular) 
class Basket extends DataMapper 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    var $has_one = array('user'); // each basket belongs to one user 
    var $validation = array(...); 
} 

// user model 
class User extends DataMapper 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 
    var $has_many = array('basket'); // each user can have many baskets 
    var $validation = array(...); 
} 

// controller 
public function __construct() 
{ 
    parent::__construct(); 
} 

public function index() 
{ 
    $basket = new Basket(); 
    $basket->blah = 'whatever'; 
    $basket->save(); 
    // at this point, $basket is saved to the database 
    // now let's add it to the user 
    $user = new User(); 
    $user->where('id', 1)->get(1); 
    // now we have a user 
    // save the relationship to the basket 
    $user->save($basket); 
    // now $basket->user_id == 1 

    // get the username from the basket 
    $u = $basket->user->get(); 
    $username = $u->username; 

    // yes, there are faster and shorter ways to write most of this, 
    // but I think for beginners, this syntax is easier to understand 
} 
+0

추적 할 수없는 문제가있는 때가 많습니다. 모델 또는 컨트롤러 또는 중복 된 이름을 가진 이름이 붙은 것입니다. 그것이 당신의 문제인지 아닌지 모르겠지만, 당신은 그것을 점검 할 것입니다. – swatkins

+0

당신의 대답이 정말로 그 질문에 답하는지는 아직 모르겠지만 당신 말이 맞을 수도 있습니다. 아마도 일종의 명명 충돌이있을 것입니다. 어쨌든 가장 좋은 대답 이었기 때문에 크레딧은 당신 것입니다. 어쨌든 시작점으로 사용했던 샘플 앱과이 링크를 발견했습니다. 그 사람에게도 소품 :-) http://www.terrymatula.com/development/2011/codeigniter-and-datamapper-orm-base-installation/ – Anders

+0

'$ this-> load-> model ('카트');'생성자로부터? 내 답변에서 말했듯이 datamapper는 모델을로드합니다. 이로 인해 충돌이 발생할 수 있습니다. – swatkins

0

CodeIgniter는 모델에 대한 documentation는 생성자에서

$this->load->model('Model_name'); 

를 호출하여 모델을로드 할 수, 당신은 그래서 당신을

$this->Model_name->function(); 

를 수행하여 컨트롤러에이 모델을 액세스 할 수있는 상태 컨트롤러 코드를

public function __construct() 
{ 
    parent::__construct(); 
    $this->load->model('Cart'); 
} 

public function index() 
{ 

    $this->Cart->functionCall(); 
} 
+0

아니요, 불행히도 여전히 작동하지 않습니다. 설명서에 Data Mapper와 함께 사용하는 것이 확실합니까? 그 문서에서 CI의 일반적인 모델 사용을 재정의한다고 말했기 때문에 ... 그리고 모든 사용 예는 제가 예제 코드에있는 것을 보여줍니다. 나는 잘 작동하는 다운로드 가능한 샘플 프로젝트를 찾았는데, 그 차이점이 내 프로젝트에 무엇인지 알지 못한다. 내가 인증을 위해 이온 인증을 사용하고 있다는 것을 제외하고는 아마도 충돌이있을 수 있습니다 ...? – Anders

+0

그렇다면 CodeIgniter에 익숙하지 않습니다. 하나의 마지막 생각은 var $ validation = array (...) 문을 제거해 보았습니까? –

+0

예, 실제로 이미 시도했습니다 ... 그래, 어쨌든 고마워! – Anders

관련 문제