2つをとります。 Device.phpで
:その後、
// 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
);
}
要求されたデバイスが要求しているユーザが所有している場合は見つける:これは動作しますが、非効率的に不要なの多くを取得するのと同じように思え
$device = Device::model()->findByPk($deviceId);
if ($device->users->findByPk($userId) == Null)
$device = Null;
あなたは既にそのユーザーが誰であるのか、すでに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、あなたは正しいです。 –