使用hasMany()include从findAll()中选择特定的连接记录

时间:2012-07-05 12:00:30

标签: orm coldfusion cfc cfwheels

(我尝试将其发布到CFWheels Google Group(两次),但出于某种原因,我的消息从未出现。该列表是否已审核?)

这是我的问题:我正在使用车轮上的CF社交网络应用程序,与我们在Chris Peters的精彩教程中所熟悉的应用程序完全不同。但是,在我的网站中,我需要在用户目录中显示最新的状态消息。我有一个带有hasMany(“状态”)的用户模型和一个带有belongsTo(“用户”)的状态模型。所以这是我开始使用的代码:

users = model("user").findAll(include="userprofile, statuses");

这当然会为状态表中的每条状态消息返回一条记录。大规模的矫枉过正。接下来我尝试:

users = model("user").findAll(include="userprofile, statuses", group="users.id");

越来越近了,但现在我们要为每个用户获取第一个状态记录(最低status.id),当我想选择最新状态时。我认为在直接SQL中我会首先使用子查询来重新排序状态,但在车轮ORM中我无法使用。那么有没有另一种干净的方法来实现这一点,或者我是否必须拖动一个巨大的查询结果或将状态对象转换为我的CFML,然后在循环时过滤它们?

2 个答案:

答案 0 :(得分:1)

您可以使用calculated property

获取最新状态
// models/User.cfc
function init() {
    property(
        name="mostRecentStatusMessage",
        sql="SELECT message FROM statuses WHERE userid = users.id ORDER BY createdat DESC LIMIT 1,1"
    );
}

当然,SELECT语句的语法将取决于您的RDBMS,但这应该可以帮助您开始。

缺点是您需要为查询中需要的每个列创建计算属性。

另一种选择是在模型中创建方法并在<cfquery>标记中编写自定义SQL。这种方式也完全有效。

答案 1 :(得分:0)

我不知道你确切的数据库架构,但是你的findAll()看起来不应该像这样:

statuses = model("status").findAll(include="userprofile(user)", where="userid = users.id");

那应该从特定用户那里得到所有状态......还是所有用户都需要它?我发现你的问题有点棘手。你到底想要归还的是什么?