我使用Yii,有3个表: users,devices,users_devices表(user_id,device_id)来定义它们之间的MANY_MANY关系。
我正在寻找的是通过ActiveRecord从属于特定用户(users.id)的id (devices.id)中查找设备的最简单方法。
场景是REST API正在查询设备,但出于安全原因,我想验证该设备是否归用户所有。
这个想法是这样的:
$device = Devices::model()->findByPk($deviceId)->having(
array('user_id' => $userId));提前感谢你的帮助,我已经研究了一段时间了,但找不到一个优雅的解决方案。
发布于 2011-08-05 14:51:31
在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'])));发布于 2011-08-05 15:12:18
拿两个。
在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。为了避免这种无效,Yii Agile Development一书使用原始SQL在父模型(Device.php)中进行M2M关系查询:
// "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而不是Devices作为模型的名称(同样使用device作为表名)。如果剪切和粘贴,则进行重构。User也是如此。缺少"tbl_“前缀也是如此。
发布于 2011-08-05 10:38:51
你一定要用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();https://stackoverflow.com/questions/6946488
复制相似问题