2008-10-13 4 views
0

안녕하세요, 저는 누군가 이걸 만들기 위해 Cake PHP에 대한 충분한 경험이 있기를 바랍니다.

저는 현재 순간적으로 트위터 클론이라고 불릴 수있는 작업을하고 있습니다. 본질적으로 나는 이런 식으로 설정했다.

사용자가 많습니다. 이것은 사용자 테이블과의 많은 관계입니다. 이것은 열 user_id, friend_id와 함께 friends_users라는 링크 테이블에 저장됩니다. 사용자는 열 user_id가있는 테이블입니다.

그런 다음 사용자에게 연결되는 팁이라는 테이블이 있습니다. 사용자는 여러 가지 팁을 가질 수 있습니다.

필자가 전달한 userid가 소유 한 모든 팁과 해당 사용자의 모든 친구가 소유 한 팁을 반환하는 Tip 모델에서 찾기를 수행하는 방법을 찾아야합니다.

이 SQL 쿼리는 완벽하게 작동 -

사용자 #의 2 초 팁뿐만 아니라 2

지금은 같은 일을 할 수있는 방법을 사용자의 친구입니다 누구의 끝을 반환

SELECT * 
FROM `tips` 
JOIN users ON users.id = tips.user_id 
JOIN friends_users ON tips.user_id = friends_users.friend_id 
WHERE (friends_users.user_id =2 or tips.user_id=2) 
LIMIT 0 , 30 

$this->Tip->findxxxxx(user_id)

내가 필요한 경우 Tip->query을 사용할 수 있음을 알고 있지만 어려운 방법을 배우려고합니다.

답변

3

쿼리 결과에 필요한 팁 목록이 있으면이 쿼리를 두 번 실행하면 좋을 것입니다. 첫 번째는이 사용자와 친구의 사용자 ID 목록을 찾고 둘째는이 ID 중 하나에 속하는 도움말을 찾습니다. 그래서, 당신 팁 모델 : 당신이 그것을 만들 필요가 없습니다 있도록, CakePHP를 귀하의 HABTM의 friends_users 테이블을 모델링하는 데 사용하는 자동적으로 생성 "FriendsUser"모델의 첫 번째 찾기를 호출하고

function findTipsByUserAndFriends($userId) { 
    //FriendsUser is automagically created by CakePHP "with" association 
    $conditions = array('FriendsUser.user_id'=>$userId); 
    $fields = 'FriendsUser.friend_id'; 
    //get a list friend ids for the given user 
    $friendIds = $this->Tip->User->FriendsUser->find('list', compact('conditions', 'fields')); 
    //get list of all userIds for whom you want the tips 
    $userIds = array($userId) + $friendIds; 
    $conditions = array('Tip.user_id'=>$userIds); 
    $tips = $this->Tip->find('all', compact('conditions')); 
    return $tips; 
} 

주 .

이 코드는 테스트되지 않았으므로 일부 코드는 디버깅해야하지만 아이디어는 얻을 수 있습니다.

+0

그 것처럼 보입니다. Theres 일부 구문을 내가 본 havent, 처음에는 혼란스러워했다 '조건'및 변수 대신 '필드'문자열을 사용합니다. 또한 나는 그것이 FriendsUsers가 될 것으로 예상했지만 너의 말이 옳았다. 감사. – JoshReedSchramm

0

CakePHP에서는 많은 사람들이 "가지고 있고 속해 있습니다"(HABTM)입니다. 릴레이션을 올바르게 설정했다고 가정하면, 당신이해야 할 일은 두 레벨의 재귀 적 찾기가있어서, 당신이 찾은 친구가 모든 친구를 불러오고, 그 친구들은 팁을로드하게됩니다. 친구들이 친구들을 사귀지 못하도록 모델을 동적으로 바인드/바인딩 해제해야 할 수도 있습니다 (실제로는 문제가 많지 않을 수도 있음).

manual entry on associations은 필수입니다.

+0

나는 아직도 혼란 스럽다. 나는 협회 일을 꽤 많이 읽고 꽤 모든 관계가 올바르게 설정되어 있다고 확신합니다. 사용자 hasAndBelongsToMany 친구. 팁 belongsTo 사용자하지만 내가 원하는 구문을 find에 대한 구문을 모른다. – JoshReedSchramm

1

나는 containable을 사용하는 것이 좋습니다 것이 좋습니다.

$aCond = array(
      'fields' => array(
       'Discount.*' 
      ), 
      'contain' => array(
       'Event' => array(
        'conditions' => array('Event.id' => $iEventId) 
       ) 
      ) 
     ); 
$aBulkDiscounts = $this->Discount->find('first', $aCond); 

희망이 도움이됩니다.

관련 문제