【问题标题】:Selecting specific joined record from findAll() with a hasMany() include使用 hasMany() 从 findAll() 中选择特定的连接记录包括
【发布时间】:2012-07-05 12:00:29
【问题描述】:

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

这是我的问题:我正在 CF on Wheels 中开发一款社交网络应用程序,与我们在 Chris Peters 的精彩教程中所熟悉的应用程序并无太大区别。不过,在我的情况下,我需要在用户目录中显示最新的状态消息。我有一个带有 hasMany("statuses") 的 User 模型和一个带有 belongsTo("user") 的 Status 模型。所以这是我开始的代码:

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

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

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

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

【问题讨论】:

    标签: orm coldfusion cfc cfwheels


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

    【讨论】:

    • 嗨,克里斯。非常感谢您的回复(并且通常让我们其他人可以访问 CFW!)。 property() 解决方案是一个好的开始(这让我眼前一亮),但正如所写的那样,它只是获得了最新的状态,一次。如果适用,我需要每个用户的最新状态(有些根本没有状态)。
    • 很抱歉。在将WHERE 子句添加到子查询的情况下,我的编辑是否有效?
    • 嗯,我在上次回复之前尝试过,但它所做的只是获取第一条记录的消息。我有 4 个测试用户,在用户和用户配置文件中有记录。其中两个至少发布了一个状态;其他两个没有。只有 user.id = 1 的状态才会被抓取,所以大概是第一个检查的。之后,我得到一个返回所有其他 3 个用户状态的 "" 值。
    • 尝试转储您返回的查询,看看它运行的是哪种 SQL。理论上,我的代码应该可以工作。
    【解决方案2】:

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

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

    这应该从特定用户那里获取所有状态...或者是所有用户都需要它?我发现你的问题有点难以解决。你到底想得到什么回报?

    【讨论】:

      猜你喜欢
      • 2019-07-05
      • 2017-06-28
      • 2014-01-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多