2011-12-15 3 views
4

죄송합니다. 제목이 적절하지 않은 경우, 제 문제에 대한보다 정확한 설명에 대한 제안이 있으시면 제안하십시오.중간 남자 객체의 관계의 다른면 검색하기

Symfony 2 애플리케이션에서 작업 중이며 다른 사용자와 관련된 사용자 객체가 있습니다. 간단한 유스 케이스가 친구이지만 복잡한 경우도 있습니다. 원래 사용자와 삶의 관계는 단순한 다 대다 관계였습니다.

는 지금은, 두 사용자 사이의 관계 자체에 메타 데이터를 추적하는 등이 필요합니다

관계가 요청 된
  • 이 받아 들여졌다
  • 이 종료
  • 경우 그것은 끝났다,이 관계가 재개되는 것을 막기위한 블록이있다.

나는 꽤 많은 연구를 해왔고 Doctrine과 같은 것으로 보인다. 관계가 아니라 엔티티가 아니기 때문에 메타 데이터를 가질 수 없다. 중간 사람 객체를 사용하도록 제안되었으므로 사용자는 Friendship 객체와 다 대다 관계를 유지합니다. 우정 개체는 메타 데이터와 두 사용자에 대한 참조를 포함합니다.

이제이 우정 개체가 있다면 내 문제에 어떻게 다른 측면을 검색합니까? 다른 사용자에게 알리기 위해 내가 아는 사용자를 전달하는 기능이 있습니까? 내가 이것을 구현하는 생각을 한 가지 방법은 다음과 같습니다,하지만

$user = $this->getCurrentUser(); 
$friends = array(); 
foreach($user->getFriends() as $friendship) 
{ 
    $friends[] = $friendship->not($user); // return the user we dont have 
} 

및 $ friendship->하지() 존재하는 또 다른 방법이 있어야한다 나에게 보인다

public function not($user) 
{ 
    return $this->user1===$user ? $this->user2 : $this->user1; 
} 

답변

3

나는 몇 년 전에 우정 문제를 해결했습니다. 모든 세부 사항을 기억하지는 않지만, 내가 기억하는 것을 말하려고 노력할 것입니다.

실제의 many-to-many 연관이 적은 일반적인 : 모든

첫째는 말한다이 section, 봐. [...]

many-to-many 연관은 덜 공통적 인 이유는 무엇입니까? 추가 속성을 연관과 자주 연결하기를 원하기 때문에 연관 클래스를 도입합니다. 결과적으로 직접적인 다 대다 연관성은 사라지고 3 개의 참여 클래스 사이에 일대 다/다 대일 연관으로 바뀝니다.

그래서, 나는 userfriendship 테이블에 매핑 된 UserFriendship 엔티티를했다. - 즉, Friendship 클래스는 단방향 방식으로 User 클래스를 참조

| friendship | 
+--------------+ 
| from_id  | 
| to_id  | 
| requested_at | 
| accepted_at | ← if this is not null, then it was accepted 

나는 간단하게 유지하는 것을 선호하기 때문에

, 내 User 실체가 Friendship 기관의 인식되지 않은 : 후자는 같은 것을 보았다. 귀하의 경우에 이것이 의미하는 바는 User 클래스의 친구 목록을 얻을 수 없다는 것입니다. 당신은 물론 그것을 할 수있는 방식으로 구현할 수 있습니다.

다음, 나는 "from$user 또는 to$user 동일 동일 곳의 모든 우정을 찾을 수 있습니다"와 같은 데이터베이스 요청을 만들 것 findBy(User $user) 같은 방법을 가지고이 FriendshipService 클래스합니다 (Service Layer 패턴)을했다. (아마도 그 쿼리에 뭔가 다른 것이 있었지만 기억이 안납니다.) 데이터베이스에서 우정의 집합을 얻은 후에는 그것을 반복하고 모든 친구들을 나열하는 것은 쉽지 않습니다. 다음과 같은 우정의 다른면을 얻을 수 있습니다.

$otherSide = 
    $friendship->getFrom() == $currentUser ? 
    $friendship->getTo() : 
    $friendship->getFrom(); 
+0

감사합니다 elnur, 내가 다른 몇 가지와 논의하고 게시물을 참조, 나는이 방향으로 이동할 것 같아요. –

+0

User 클래스에서 Friends를 가져올 수있는 방법을 지정할 수 있습니까? – k0pernikus

0

당신이 경우 참조 만 저장하면 사용자와 관계의 병렬 배열을 유지할 수 있습니다.

$user = $this->getCurrentUser(); 
$friends[] = $user->getFriends(); 
$friendships[] = $user->getFriendships(); 

friends [0]은 (는) $ user와 (과) 우호 관계가 있습니다.

이 속도를위한 공간이 꽤 표준 트레이드 오프, 당신은 객체가 아니라 참조를 저장하는 경우 물론 삽입에 추가 단계가 필요합니다/

등이 삭제됩니다, 이것은을 많이 사용할 수 있습니다 공간은 매우 빠르지 만 우정을 완전히 분리 된 목록으로 유지하고 $ user가 포함 된 모든 우정을 찾는 것이 좋습니다.

+0

고마워요. Thomas는 약간의 통찰력을 제공합니다. 모든 메타 데이터를 추적하기 위해 개체를 저장해야하지만 (메타 데이터 목록이 늘어날 가능성이 있음), 별도의 관계로 이동하는 것이 좋습니다. –