두 가지를 취하십시오. 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_"접두어가 누락되었습니다.
users_devices는 user_id와 device_id를 기본 (복합) 키로 사용합니까? 그런데, 그들이 [여기] (http://learnyii.blogspot.com/2010/12/yii-on-many-many-relationships.html)처럼 prmaryKey()를 재정의하는 것을 잊지 마십시오. 그리고 사용자 정의 모델을 사용하여 테이블에서 찾기 만하면 사용자 장치 관계 (또는 사용자 인터페이스 관계 없음)를 식별 할 수 있습니다. – hobs
당신은 HAS_MANY가 아닌 MANY_MANY를 의미했습니다. – hobs
@Hobs, 맞습니다. –