Kohana 3 ORM - 与静态方法的连接和has_many关系

时间:2012-10-18 11:42:43

标签: php mysql orm kohana-3

我有Model_User,它扩展了ORM,与角色的关系为$_has_many

protected $_has_many = array(
    'roles' => array('model'=>'role','through'=>'users_roles'),
);

我有一个静态函数返回所有活跃用户:

public static function get_all_active_users()
{
    return self::factory('user')->where('status', '=', 'active')->find_all();
}

我想根据以下sql更新函数以仅返回特定角色的用户:

SELECT `users`.* FROM `users`
INNER JOIN `users_roles` ON `users_roles`.`user_id` = `users`.`id`
INNER JOIN `roles` ON `roles`.`id` = `users_roles`.`role_id` AND `roles`.`identifier` = 'admin'
WHERE `users`.`status` = 'active'

有没有办法在get_all_active_users方法中过滤结果,还是应该创建新方法并手动加入?

2 个答案:

答案 0 :(得分:1)

这对我有用:

return self::factory('user')
                ->join('users_roles', 'INNER')->on('users_roles.user_id', '=', 'user.id')
                ->join('roles', 'INNER')->on('roles.id', '=', 'users_roles.role_id')
                ->where(roles.identifier', '=', 'admin')
                ->where('status', '=', 'active')
                ->find_all();

有兴趣了解任何替代方案。

答案 1 :(得分:0)

更优雅的方法是将角色模型定义为拥有许多这样的用户:

protected $_has_many = array(
  'users' => array('model'=>'user','through'=>'users_roles'),
);

然后通过角色本身提取用户:

return self::factory('role')
            ->where('identifier', '=', 'admin')
            ->users->
            ->where('status', '=', 'active')
            ->find_all();