2012-04-09 4 views
0

을 찾기 문을 사용하고 가입 I이 사용자간에 우정을 수 있습니다 내 CakePHP의 응용 프로그램은 다음 표 :목록 데이터 테이블

**Users** 
id 
username 
password 

**Profiles** 
id 
firstname 
lastname 
user_id 

**Friends** 
id 
user_id_to 
user_id_from 
status 

을 그래서 기본적으로 사용자가 프로파일을 가지고 있으며, 사용자가 다른 사용자와 친구가 될 수 있으며, 이것은 단순 상태가 확인되었거나 0 또는 1을 사용하지 않는 friends라는 데이터베이스 테이블에 기록됩니다 (int 임). 그래서 친구는 두 명의 사용자 사이의 조인입니다. 는 사용자 카메론의 친구 목록이 표시됩니다

/people/cameron/friends :

내가 예를 들어 내가 같은 URL을 얻을 경우 있도록 사용자의 친구 목록에 노력하고있어.

그러나 find 문을 사용하여 사용자를 전달하고 프로필 데이터가있는 것을 확인한 다음 해당 사용자와 관련된 친구를 나열하는 데 어려움을 겪고 있습니다. 누구든지 도와 줄 수 있습니까?

이 프렌드, 사용자 및 프로필 모델입니다 :

class Friend extends AppModel 
{ 
    public $name = 'Friend'; 

    public $belongsTo = array('User'); 

    public $actsAs = array('Containable'); 

} 

User.php는

class User extends AppModel 
    { 
     public $name = 'User'; 

    public $hasOne = 'Profile'; 

    public $hasMany = array(
     'Post', 
     'Answer', 
     'Friend' => array(
      'foreignKey' => 'user_id_to' 
     ) 
    ); 

public $belongsTo = array(
     'Friend' => array(
      'foreignKey' => 'user_id_from' 
     ) 
    ); 

    public $actsAs = array('Containable'); 

     public function getFriends($username) 
     { 
     return $this->find('all', 
     array('conditions' => array('User.username' => $username, 'Friend.status'=>1), 
      'contain' => array('Friend' => array('User')) 
     )); 
     } 
    } 
Profile.php

class Profile extends AppModel 
{ 
    public $name = 'Profile'; 

    public $belongsTo = 'User'; 

    public $actsAs = array('Containable'); 
} 

이는 친구를 보여주는 내 방법입니다 사용자 목록 :

public function index($username) 
{ 
    $friends = $this->User->getFriends($username); 

    $this->set('friends', $this->paginate()); 
} 

나는 현재이 오류를 받고 있어요 :

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'User.user_id_from' in 'on clause' 
SQL Query: SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`email`, `User`.`status`, `User`.`code`, `User`.`lastlogin`, `Friend`.`id`, `Friend`.`user_id_from`, `Friend`.`user_id_to`, `Friend`.`datetime`, `Friend`.`status` FROM `db52704_favorr`.`users` AS `User` LEFT JOIN `db52704_favorr`.`friends` AS `Friend` ON (`User`.`user_id_from` = `Friend`.`id`) WHERE `User`.`username` = 'cameron' AND `Friend`.`status` = 1 

앱이 외래 키는 사용자 테이블보다는 그들이 친구 협회 내에서 호출에도 친구 테이블에 생각하는 것처럼 것 같습니다 ... 문제는 무엇입니까?

+0

모든 업데이트를 나는 그것을 확신으로 뭔가 간단하게 잘못된 장소에있어 ... 감사합니다 – Cameron

답변

0

때마다 당신은 $ belongsTo를위한 외래 키를 지정 사용자가 지정한 이름이 필드의 이름임을 기억

당신이 권리를 강제로 다음 각 관계를 교체 시도 할 수는 문을 가입 현재 테이블이 아니고 다른 테이블이 아닙니다.

예를 들어 'foreignKey' => 'user_id_to'에 대한 $ belongsTo 참조는 친구 모델이 아니고 사용자 모델이어야합니다. 이 혼란 얻을 (심지어 케이크 애플 리케이션의 년 후에, 나는 아직도 내가 새 프로젝트를 시작할 때 새로 고쳐야) 않는

, 케이크의 문서를 다시 읽어이에 http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

+0

하지만 사용자가 친구이고 많은 친구가있어서 User 모델에 있어야한다고 말하고 있습니까? – Cameron

+0

내가 게시 한 링크를 확인하십시오. Cake의 belongsTo/hasOne/hasMany는 직관적이지 않을 수 있습니다. 문서는 각 유형에 대해 FK가 저장되는 위치를 지정합니다.다음은 문서에서 잘라 내기/붙여 넣기입니다 :'hasOne : 다른 모델은 외래 키를 포함합니다; belongsTo : 현재 모델에 외래 키가 포함되어 있습니다. hasMany : 다른 모델은 외래 키를 포함합니다. '등등. 더 잘 이해하려면 예제를 참조하십시오. – Costa

+0

이것은 여전히 ​​의미가 없습니다! 내가 실제로이 사실을 알지 못해서 각 모델에 있어야 할 것을 게시 할 수 있습니까? – Cameron

0

조인 쿼리를 생성 할 때 Cake가 foreignKey 할당에 혼동을 일으키는 것처럼 보입니다.

public $hasMany = array(
    'Friend' => array(
     'foreignKey' => null, 
     'conditions' => array('Friend.user_id_to = User.id') 
    ) 
); 

public $belongsTo = array(
    'Friend' => array(
     'foreignKey' => null, 
     'conditions' => array('Friend.user_id_from = User.id') 
    ) 
); 
관련 문제