根据 Kohana 中另一个表中的数据对 mysql 结果进行排序

Posted

技术标签:

【中文标题】根据 Kohana 中另一个表中的数据对 mysql 结果进行排序【英文标题】:Sort mysql results based on data from another table in Kohana 【发布时间】:2011-10-12 09:34:26 【问题描述】:

我继承了这个 Kohana 项目,但对它和 ORM 的经验很少。

表结构是这样的:

ROLES TABLE
id
name
ROLES_USERS TABLE
role_id
user_id
USERS TABLE
id
email
password
last_login

问题是,我需要根据用户是否具有特定角色(在本例中为登录)对用户进行排序,但不知道如何使用 ORM 来做到这一点。 当前查询是:

$users = ORM::factory('user')
    ->limit($pagination->items_per_page)
    ->offset($pagination->offset)
    ->order_by('last_login', 'DESC')
    ->find_all();

然后在输出时打印如下:

$row['status'][] = ($user->has('roles', ORM::factory('role', array('name' => 'login')))
    ? '<span class="green">Active</span>'
    : '<span class="red">Blocked</span>');

所以问题将是如何更改查询以便能够按用户是否被允许登录进行排序。

【问题讨论】:

【参考方案1】:
$users = ORM::factory('user')
    ->join('roles_users', 'LEFT')
        ->on('roles_users.user_id', '=', 'user.id')
    ->join('roles', 'LEFT')
        ->on('roles_users.role_id', '=', DB::expr("roles.id AND roles.name = 'login'"))
    ->group_by('user.id')
    ->order_by('IFNULL("roles.id", \'2000\')', 'ASC')
    ->find_all()

我希望您没有 2000 个角色,但使用此查询应该首先使用活跃用户

【讨论】:

这工作谢谢!在第二次加入后,只有一个封闭的括号可以关闭“on”,但它工作得很好。【参考方案2】:

也许您可以获取登录角色的用户?

$login_users = ORM::factory('role', array('name'=>'login'))->users->find_all();

【讨论】:

如果我理解正确,它将获取所有具有登录角色的用户。但我需要所有用户能够根据他们是否具有登录角色对输出进行排序。但是,也许您正在做某事……如果可以加入没有该角色的用户,那也许也可以工作。 但是你已经在你的问题中发现了这一点 $user->has('roles', ORM::factory('role', array('name' => 'login')) 是的,但这会过滤结果而不是对它们进行排序。正如我所说,我对 Kohana 和 ORM 的理解是有限的。无论如何,感谢您的帮助。

以上是关于根据 Kohana 中另一个表中的数据对 mysql 结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何根据laravel控制器中另一个表中保存的数据创建触发器以填充数据库中的表

根据表中另一个现有列的内容更改 SQL Server 中的现有列

根据 Access DB 中另一个表中的多条记录计算字段的值

如何根据oracle中另一个表中的值更新一个表中的字段[重复]

Kohana 3.0.x ORM:读取数据透视表中的其他列

如何从 SQL Server 2005 中另一个表中的相应数据更新一个表中的数据