2014-05-19 1 views
0

의 여러 속성을 사용하여 하나 개의 테이블에 여러 테이블을 조인 :MySQL은 : 내가 3 개 테이블이 그 하나의 테이블

  • 활동
  • 게시물
  • 댓글

활동하는 두 가지 속성이 있습니다 item_iditem_type. 속성 item_type은 게시물인지 코멘트인지 지정하고 item_id에는 해당 유형의 ID가 포함됩니다. 덧글은 또한 게시물에 링크되어 있습니다. 게시물 작성 시간에 따라 활동을 정렬해야합니다. 활동이 게시물이나 코멘트에 링크 될 수 있으므로 어떻게 그런 종류의 연관을 정의하고 cake PHP에서 쿼리를 작성할 수 있습니까?

편집 :
이 질문에 관련 속성을 다음과 같다
활동 : ITEM_ID, ITEM_TYPE
게시물 : ID가,
댓글 작성 : ID를 귀하의 경우 포스트에

+1

을 할 수 있습니까? – vhu

+0

@vhu : 충분한 설명이 필요하십니까? 문맥 상 다른 세부 정보가 적절하지 않을 수도 있습니다. – ChiragAgarwal

+0

활동이 댓글과 관련이 있고 게시물이 아닌 내용과 관련이있을 때 어떻게 고려해야할까요? 목록에서 제외 하시겠습니까? 목록의 맨 아래에 넣거나 댓글과 관련된 게시물의 작성 날짜를보고 싶습니까? – arilia

답변

0

을 POST_ID 코멘트를 가지고 게시물을 게시하지 않고도 덧글을 입력 할 수 없습니다. 저는 PHP 사용자가 아니지만 샘플 쿼리를 통해 설명 할 수 있습니다.

SELECT * FROM Activities a 
     INNER JOIN Posts p ON a.item_id = p.item_id 
     INNER JOIN Comments c ON c.post_id = p.id 
ORDER BY created 

나는 이것이 당신을 도울 것이라고 생각합니다. 당신의 Activity 모델에서 아주

public $belongsTo = array 
(
    'Post' => array 
    (
     'foreignKey' => 'item_id', 
     'conditions' => array('Activity.item_type' => 'Post') 
    ), 
    'Comment' => array 
    (
     'foreignKey' => 'item_id', 
     'conditions' => array('Activity.item_type' => 'Comment') 
    ) 
); 

에서

0

당신의 ActivitiesController 당신이 전체 테이블 설명을 제공 시겠어요 당신이

$this->Activity->virtualFields['post_created'] => "IF(Activity.item_type = 'Post'), Post.created, CommentPost.created)"; 

$this->Activity->find 
(
    'all', 
    array 
    (
     'joins' => array 
     (
      array 
      (
       'table' => 'posts', 
       'alias' => 'CommentPost', 
       'conditions' => array(
        'Comment.post_id = Post.id' 
      ) 
     ), 
     'order' => array('Activity.post_created'), 
    ) 
); 
+0

코멘트 일지라도 작성한 시간에 따라 필터링하고 싶습니다. 이 경우 cake가 테이블에 조인하지 않고 복수 쿼리를 수행하는 경우 재귀 수준 인 – ChiragAgarwal

+0

을 사용하여 게시물의 작성 시간을 찾아야합니다. 따라서 두 번째 수준의 재귀를 위해 테이블을 수동으로 조인해야합니다. 내 대답을 수정하겠습니다. – arilia