2012-07-05 38 views
0

(我想张贴这对CFWheels谷歌集团(两次),但由于某种原因从来没有出现在我的消息。在该列表主持?)中选择特定的加盟记录来自的findAll()使用的hasMany()包括

这是我的问题:我正在研究Wheels上的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中,我会使用子查询来重新排序状态,但这在Wheels ORM中不适用于我。那么是否有另一种干净的方式来实现这一点,或者我将不得不拖动一个巨大的查询结果或将状态对象反馈到我的CFML中,然后在我循环时将其过滤掉?

回答

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。这种方式也是完全有效的。

+0

嘿克里斯。非常感谢(通常我们其他人都可以访问CFW!)。财产()解决方案是一个好的开始(这正在盯着我),但正如它所写的,它只是一次获得最新的状态。我需要每个用户的最新状态(如果适用)(有些根本没有状态)。 – 2012-07-05 17:19:39

+0

对不起。我的编辑工作在哪里向子查询中添加了“WHERE”子句? – 2012-07-05 17:36:15

+0

嗯,我在最后一次回应之前试过,但它所做的只是获取第一条记录的消息。我有4个测试用户和用户和用户配置文件中的记录。其中两人至少有一个发布状态;另外两个没有。该状态只能抓取user.id = 1,所以大概是第一个被检查。之后,我会为所有其他3个用户的状态返回一个“”值。 – 2012-07-05 17:43:55

0

我不知道你的确切DB模式,但不应该你的findAll()看起来更像是下面这样的:

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

这应该让所有的状态从一个特定的用户...或是否你需要它为所有用户?我发现你的问题有点棘手。你到底想要返回什么?

相关问题