2009-11-12 6 views
1

이제 응용 프로그램에서 사용자를 나타내는 모델 User가 있습니다. 그리고 나는 getById ($ id)와 getAll()과 같은 메소드를 가진 UserRepository를 사용합니다.MVC 애플리케이션에서 모델의 관계?

사용자가 리뷰를 게시 할 수 있습니다. 사용자의 5 또는 10 또는 20 개의 마지막 리뷰를 보여주고 싶다면 생각하는 사용자에게 가장 논리적 인 질문입니다. 그래서 나는 $ user-> getLastReviews (5) 메소드를 가질 것이다.

하지만 이것을 구현하는 가장 좋은 방법은 무엇입니까? 각 사용자에게 ReviewRepository의 인스턴스를 제공합니다 (예 : $ reviewRepository-> getByUser (User $ user)). 아니면 더 좋은 방법이 있습니까?

답변

1

다른 모델의 인스턴스를 포함하고 사용하는 것이 좋습니다. 따라서 사용자 모델에 Review 모델의 인스턴스가 포함되도록하고 검토 모드에서 해당 리뷰를 가져 오는 논리를 처리하게하십시오.

또한, 당신과 같이 그것을 처리하기 위해 UserRepository에 메서드를 추가 할 수 있습니다

class UserRepository extends Model{ 
    $review = new reviewRepository(); 
    function getReviews($numOfReviews){ 
     return $this->review->getReviews($user_id); 
    } 
0

또 다른 옵션은 두 변수에 전달 된 저장소 방법을 생성하는 것입니다. $ reviewRepository-> getLastReviewsByUser (5, $ user)와 같은 것입니다.

+0

내가 지금까지 주로 사용했던 옵션입니다. 하지만 컨트롤러에서이 메서드를 호출하면됩니다. 그렇다면 도메인 모델에는 직접적인 관계가 없지만 간접적 인 관계는 더 있습니다. – Derk

0

보통 이것은 ORM의 직업입니다. 거의 모든 프레임 워크는 하나의 구현 (즉 PHP/Symfony 용 Doctrine 또는 Java 용 Hibernate)을 사용하지만 자연스럽게 고유 한 ORM을 구현할 수 있습니다 (ORM은 종종 내성을 사용하여 구현됩니다).

일단 ORM 라이브러리가 있으면 "설정 단계"에서 모델 간의 관계를 정의합니다 (사용자가 많은 리뷰를 갖게됩니다). 그런 다음 ORM 메서드를 사용하여 해당 메서드를 처리하는 방법을 사용합니다 (종종 관계가 상호 관련이 있습니다, "리뷰는 사용자에게 속합니다"). 개념은이 설치 단계에서 지적한 것과 같은 문제를 처리하지 못하도록합니다.

내 제안은 이미 관련 모델의 getter 및 setter 메소드에 대한 기능을 제공하는 이미 존재하는 ORM 구현 중 하나를 사용하는 것입니다. 다른 경우에는 모든 모델에 대해 특수 getter 및 setter를 직접 작성해야합니다.

+0

답변 해 주셔서 감사합니다. ORM에 대해 알고 있지만 ORM에도 단점이 있습니다. 성능이 옵션이고 데이터베이스의 모든 기능을 사용하려면 일반적인 ORM이 최선의 방법은 아닙니다. – Derk

+0

getter 메소드 (예 : $ user-> getLastReviews)를 코딩 할 때 간단한 ORM을 쓰고 있다고 생각합니다. 일부 ORM은 매우 가볍습니다 (Kohana는 PHP 파일 몇 개입니다). 성능 비용은 코드 재사용과 손쉬운 유지 관리의 장점과 달리 무시됩니다. – gpilotino

관련 문제