Kohana 3 ORM - 使用静态方法连接和 has_many 关系

Posted

技术标签:

【中文标题】Kohana 3 ORM - 使用静态方法连接和 has_many 关系【英文标题】:Kohana 3 ORM - joins and has_many relationships with static methods 【发布时间】:2012-10-18 11:42:43 【问题描述】:

我有扩展 ORM 的 Model_User,与角色有 $_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 方法中过滤结果,或者我应该创建一个新方法并手动加入?

【问题讨论】:

【参考方案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();

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

【讨论】:

【参考方案2】:

一种更优雅的方式是定义角色模型以拥有许多这样的用户:

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

然后像这样通过角色本身获取用户:

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

【讨论】:

以上是关于Kohana 3 ORM - 使用静态方法连接和 has_many 关系的主要内容,如果未能解决你的问题,请参考以下文章

Kohana ORM 缓存/缓存设计方法

如何在 Kohana 3 ORM 关系中指定两个键

Kohana 2.3.4 ORM - 删除数据透视表关系

Kohana 3.2 - ORM 的 pk() 方法在 save() (create()) 之后返回 false - 为啥?

已达到 PHP 最大数据库连接数 - 使用 Kohana/ORM 启动连接

Kohana 3.2 ORM 验证和表单验证