2011-08-04 6 views
5

저는 Yii를 사용하고 있으며 사용자, 장치 간 user_id 테이블 (user_id, device_id)이 3 개인 테이블을 사용하여 MANY_MANY 관계를 정의합니다.Yii는 many_many 관계를 통해 모델을 찾습니다.

내가 찾고있는 것은 ActiveRecord를 통해 특정 사용자 (users.id)에 속한 ID (devices.id)에서 장치를 찾는 가장 간단한 방법입니다.

시나리오는 REST API가 장치를 쿼리하고 있지만 보안 상 사용자가 장치를 소유하고 있는지 확인하고자합니다. 사전에

$device = Devices::model()->findByPk($deviceId)->having(
    array('user_id' => $userId)); 

덕분에 어떤 도움을, 나는 잠시 동안이 연구 봤는데 우아한 해결책을 찾을 수없는이 같은

뭔가 생각입니다.

+0

users_devices는 user_id와 device_id를 기본 (복합) 키로 사용합니까? 그런데, 그들이 [여기] (http://learnyii.blogspot.com/2010/12/yii-on-many-many-relationships.html)처럼 prmaryKey()를 재정의하는 것을 잊지 마십시오. 그리고 사용자 정의 모델을 사용하여 테이블에서 찾기 만하면 사용자 장치 관계 (또는 사용자 인터페이스 관계 없음)를 식별 할 수 있습니다. – hobs

+0

당신은 HAS_MANY가 아닌 MANY_MANY를 의미했습니다. – hobs

+0

@Hobs, 맞습니다. –

답변

7

즉 자신을 알아 내기 위해 나를 주도의 YII 포럼에서 도움을 얻었다 :

$device = Device::model()->with('users')->find(array(
    'condition' => 'user_id = :userId AND device_id=:deviceId', 
    'params' => array(':userId' => Yii::app()->user->id, ':deviceId' => $_GET['id']))); 
1

AR을 사용해야합니까? 복잡한 문장을 다룰 때 난 항상 query builder를 사용하는 것을 선호

...

$user = Yii::app()->db->createCommand() 
    ->select('id, username, profile') 
    ->from('tbl_user u') 
    ->join('tbl_profile p', 'u.id=p.user_id') 
    ->where('id=:id', array(':id'=>$id)) 
    ->queryRow(); 
+0

Yii 's Criteria를 사용하여 복잡한 쿼리를 처리 할 때 쿼리 작성기, 끝없는 디버그를 사용해야한다고 생각합니다. 감사 –

2

두 가지를 취하십시오. Device.php에서

:

$device = Device::model()->findByPk($deviceId); 
if ($device->users->findByPk($userId) == Null) 
    $device = Null; 

그것은이처럼 보인다 작동하지만 비효율적으로 불필요한 많이 검색하는 것 : 요청 된 장치가 요청하는 사용자가 소유 한 경우 다음

// creates a users property within a Device, a container of associated Users 
public function relations() 
    { 
     return array(
      'users'=>array(self::MANY_MANY, 'User', // don't use HAS_MANY 
       'user_devices(user_id, device_id)'), // composite key assumed 
     ); 
    } 

을 찾을 수 사용자 기록은 이미 사용자가 누구인지, 이미 activeRecord를 가지고 있기 때문에 알 수 있습니다. 이 innefficiency를 방지하려면 YII 애자일 개발 책 (Device.php) 상위 모델 내에서 M2M 관계 쿼리 원시 SQL을 사용

// "Agile" uses a $user AR argument, you can use $userId instead 
public function doesUserOwnDevice($userId) 
{ 
    $sql = "SELECT user_id FROM user_devices WHERE 
    device_id=:deviceId AND user_id=:userId"; 
    $command = Yii::app()->db->createCommand($sql); 
    $command->bindValue(":deviceId", $this->id, PDO::PARAM_INT); 
    $command->bindValue(":userId", $userId, PDO::PARAM_INT); 
    return $command->execute()==1 ? true : false; 
} 

나는에 대한 마찬가지로 device 모델 (의 이름을 Device보다는 Devices을 사용 테이블의 이름). 잘라 붙이면 리팩터링하십시오. 마찬가지로 User에 대해서도 마찬가지입니다. 마찬가지로 "tbl_"접두어가 누락되었습니다.

관련 문제