首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii通过many_many关系查找模型

Yii通过many_many关系查找模型
EN

Stack Overflow用户
提问于 2011-08-05 02:15:04
回答 3查看 8K关注 0票数 6

我使用Yii,有3个表: users,devices,users_devices表(user_id,device_id)来定义它们之间的MANY_MANY关系。

我正在寻找的是通过ActiveRecord从属于特定用户(users.id)的id (devices.id)中查找设备的最简单方法。

场景是REST API正在查询设备,但出于安全原因,我想验证该设备是否归用户所有。

这个想法是这样的:

代码语言:javascript
复制
$device = Devices::model()->findByPk($deviceId)->having(
    array('user_id' => $userId));

提前感谢你的帮助,我已经研究了一段时间了,但找不到一个优雅的解决方案。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-05 14:51:31

在Yii论坛上得到了一些帮助,这让我自己弄清楚了:

代码语言:javascript
复制
$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'])));
票数 7
EN

Stack Overflow用户

发布于 2011-08-05 15:12:18

拿两个。

在Device.php中:

代码语言:javascript
复制
// 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
        );
    }

然后,为了找出所请求的设备是否属于请求用户:

代码语言:javascript
复制
$device = Device::model()->findByPk($deviceId);
if ( $device->users->findByPk($userId) == Null )
    $device = Null; 

这看起来似乎是可行的,但效率低下,因为您已经知道用户是谁,并且可能已经有了他们的activeRecord。为了避免这种无效,Yii Agile Development一书使用原始SQL在父模型(Device.php)中进行M2M关系查询:

代码语言:javascript
复制
// "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_“前缀也是如此。

票数 2
EN

Stack Overflow用户

发布于 2011-08-05 10:38:51

你一定要用AR吗?

在处理复杂语句时,我总是更喜欢使用query builder ...

代码语言:javascript
复制
$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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6946488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档