【问题标题】:CakePHP 3 ORM - Sorting based on two columns in two different related tablesCakePHP 3 ORM - 基于两个不同相关表中的两列进行排序
【发布时间】:2016-09-09 20:31:32
【问题描述】:

目前我正在尝试实现时间线功能,该功能需要对两个相关表中创建的列进行排序并相应地更新父表(在我的情况下为图片)。

更具体地说,我有一个包含许多 cmets 的图片表。我想根据 cmets 和 Pictures 表的 created 列中的最新时间戳对图片进行排序。

我有以下查询,它检索必要的数据,但没有正确排序:

public function getPicturesAndCommentsOfUser($userId){
    return $this->find()
        ->contain([
            'Comments' => function ($q){
                return $q
                    ->contain(['Users' => function ($q) {
                        return $q->select($this->select);
                    }])
                    ->order(['Comments.created' => 'ASC']);
            },
            'Users' => function ($q) {
                return $q->select($this->select);
            },
            'Albums'
        ])
        ->matching('Albums.Users', function ($q) use ($userId) {
            return $q
                ->where(['Users.id' => $userId]);
        });
}

我的问题是如何结合 Pictures.created 和 Comments.created 的顺序。我已经尝试在最后一次匹配调用之后在 ->contain(['Comments']) 和链的最外部调用 order 函数。我似乎无法弄清楚如何将这两个表相互关联,以便我可以对它们进行排序。

此外,我在其他来源 (like this one) 中读到我可以使用 union 语句,但我能找到的关于该选项的所有信息都是它适用于不相关的表,而不是相关的。

谁能给我一些关于如何解决这个问题的指导?

【问题讨论】:

    标签: sql cakephp orm cakephp-3.0


    【解决方案1】:

    首先你的目的应该是明确的。哪种订购对您有优先权? Pictures.created 还是 Comments.created?您不能同时基于两者对结果进行排序。当你做这样的事情时:

    $this->Comments->find()->order(['Pictures.created' => 'ASC'])->
        order(['Comments.created' => 'ASC']);
    

    仅保证Comments.created 的订购。如果两个 cmets 的时间相等,则它们按 Pictures.created 排序。

    还有一件事需要考虑。在填充更多的对象上构建查询。如果每个Picture HasMany Comments 尝试在Comments 上构建您的查询。当您在Pictures 上构建查询时,我不知道结果是如何排序的。因为检索到的记录不是按Pictures.id 排序的,而是在将结果转换为对象模型时,评论嵌套在图片中,并且之前的排序被释放。

    最后不要让事情变得复杂。在查询中使用 php 逻辑不会提高性能,否则会降低代码的可读性。因此,如果您要执行 php 逻辑首先检索所有数据,然后使用几个简单的foreaches 处理它。

    【讨论】:

    • 我无法在评论上构建我的查询,因为我使用的插件 (Crud v4) 的标准功能重载,只允许我用图片开头的内容替换查​​询(我映射标准索引方法)。我现在通过检索以最新评论排序的每张相关图片作为图片中的第一条评论来解决它。之后,我使用了一种手工排序算法,它给了我正确的结果。丑陋,但它有效。
    猜你喜欢
    • 2012-10-20
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2023-01-19
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多