0

doctrine이 테이블의 모델 파일을 빌드 할 때, 본질적으로 BaseModel.class.php, Model.class.phpModelTable.class.php의 세 파일을 생성합니다. 일반 지식은 어떤 수정도 Model.class.php 또는 ModelTable.class.phpBaseModel.class.php 일 때 이루어져야합니다.Symfony의 Doctrine ORM 파일 중 하나를 선택하십시오.

그러나 언제 Model.class.phpModelTable.class.php 사이에서 선택합니까? 내가 수집 한 것으로부터 Model.class.php는 단일 인스턴스이고 ModelTable.class.php는 다중 인스턴스를위한 것입니다.

여기에 빛을 비추는 사람이 있습니까?

답변

2

너무 간단합니다!

모델 호출 기사가 있다고 가정합니다.

BaseArticle.class : 당신은BaseArticle.class.php 및 Article.class.phpArticleTable.class.php 여기

각 클래스에 대한 정의는 세 종류라는 것입니다. PHP :이 클래스는 모델 정의 (또는 테이블 정의)를가집니다. 이 클래스를 편집하고 싶지 않습니다.

Article.class.php : 귀하의 모델에 대해 작성할 수있는 재정의 방법을위한 장소입니다. Article 클래스의 인스턴스가있을 때만 이러한 함수에 액세스 할 수 있습니다. 이므로 개체로만 호출 할 수 있습니다. 예를 들면 :

$article=new Article(); 
$article->getSummary(); 

ArticleTable.class.php을 :

class Album extends BaseArticle { 

    public function getSummary(){ 
     .... 
    } 

} 

를 사용하는이 작업을 수행해야하며, 이것은 당신이 당신의 전체 기사 그 커다란위한 당신의 함수를 작성하고 싶은 곳이다 (또는 전체 기사 모델에 대해 말하는 것이 낫습니다.) 가장 인기있는 기사를 찾으려면 문서에서만 작동하므로 기사 클래스에이 기능을 쓸 수 없습니다. 그러나 당신은 당신의 전체 테이블에서 이것을하고 싶습니다.그래서 :

class AlbumTable extends Doctrine_Table { 
    public static function getPopularArticles() { 
    } 
} 

당신은 당신의 함수는 정적 경우이처럼 사용할 필요가 : 그래서

Doctrine_Core::getTable('Product')->your_nonstatic_function(); 
+0

또한 ArticleTable 함수/메소드가 정적이어야하는 이유는 무엇입니까? 정적이 아닌 잘 작동하는 몇 가지 메소드가 있습니다. – user1020069

+1

인스턴스화하지 않고 이러한 함수를 호출하기 때문에이 경우 함수는 정적이어야합니다. 그렇지 않으면 ArticleTable :: getXXX() – Firouziam

+1

Firouziam을 사용하여 액세스 할 수 있습니다. ArticleTable의 인스턴스를 Article 인스턴스와 혼동하게됩니다. 많은 경우 (대부분은 아니지만) 테이블 메소드를 정적으로 사용하지는 않습니다. 비 정적 테이블 메서드를 호출하려면 필자가 내 대답에 포함 된 코드를 사용해야합니다. Doctrine_Core :: getTable ('Product') 비 정적 함수 호출을 허용하도록 테이블 클래스의 인스턴스를 검색합니다. – Omn

0

공식 문서 (Model Classes)에서 아주 잘 답변을 찾을 수 있습니다. 기본적으로

은 약 Model.class.php :

Model는 데이터베이스의 레코드를 대표하는 객체 CLASSE입니다. 레코드 열과 관련 레코드에 대한 액세스 권한을 부여합니다. 즉, Model 개체의 메서드를 호출하여 모델의 제목을 알 수 있습니다. ModelTable.class.php를 들어

:

ModelTable 테이블 CLASSE이다; 즉, 테이블에서 작동 할 공용 메소드가 포함 된 클래스입니다. 테이블에서 레코드를 검색하는 방법을 제공합니다. 그들의 방법은 일반적으로 개체 또는 관련 객체 클래스

그리고 BaseModel.class.php의 개체의 컬렉션 복귀 : lib/model/doctrine/base/ 디렉토리에 보관

Base 수업은 직접 스키마에서 생성 된 것들입니다. 모델을 새로 빌드 할 때마다이 파일이 완전히 지워 지므로 절대 수정하면 안됩니다.

+0

:

ArticleTable::getPopularArticles(); 

과 기능을 정지하지 않을 경우 사용을 호출 할 수 있습니다

본질적으로 단일 레코드의 열을 가져 오려면 Model.class.php에서 코드를 코딩하고 여러 레코드를 가져 오려면 ModelTable.class.php로 코드화합니다. 이 올바른지? – user1020069

+0

네, 맞습니다. – j0k

3

J0k의 대답은 유익하지만 실제로는 평신도의 용어로 질문에 대답하지 않습니다. ESP. 단일 질문 대 여러 질문.

차이점은 실제로는 여러 인스턴스가 아니라 인스턴스화 된 인스턴스와 인스턴스화되지 않은 인스턴스 중 하나입니다.

아주 간단히 :

아직 읽거나 조작 할 개체의 인스턴스가없는 경우는 테이블 함수를 사용합니다.

이미 개체의 인스턴스가 있고이를 저장하거나 업데이트하거나 추가 정보 (관련 개체)를 검색하려는 경우 클래스 기능을 사용합니다.

종종 좋은 디자인으로, 당신은 정규 수업 방법과 테이블 방법 모두에서 방법을 만들어야합니다 :

종종 테이블 함수는 클래스의 기능

더 복잡에서 액세스 할 수 있습니다.

당신이 방법 또는 고객의 제품을 모두 얻기를 쓰고 싶은 말 (제품에 많은 관계로 하나를 가지고) 구매에 많은 관계로 하나 고객을 말한다. Customer.class.php에서

당신은 만들 :

public function getProducts(){} 

당신이 정규 수업 시간에이를 작성, 당신은 단지 당신이 당신의 고객

을 일단 고객이 가지고있는 어떤 제품에 관심이있을 것이기 때문에

이 같은 호출 할 수 있습니다 : 여기

Doctrine_Core::getTable('Product')->getByCustomerId($this->get('id') 

을, 당신은 어떤 제품 인스턴스를 가질 수 없습니다 아직,하지만 당신은 그들을 검색 할, 그래서 이것은 표 클래스에 가야한다.

고객에게 속한 모든 제품을 환불하는 기능을 만들려면 이것이 단일 대 복수로 단순하게 분류되지 않는 이유는 입니다. 여러 제품을 다룰 수도 있지만 테이블에 기능 만 만들려는 것은 아닙니다. 지불 처리기에 API 호출을해야 할 수도 있습니다. 각 제품의 환불 기간을 확인해야 할 수도 있습니다.

대신 테이블 함수를 작성하여 올바른 데이터를 검색 한 다음 클래스 함수를 작성하여 해당 데이터를 조작하십시오.

필자는 좋은 프로그래머가 항상이 '잘못된'메시지를받습니다. 이것은 종종 개별적인 스타일의 문제로 이어집니다.