首页 文章

CakePHP 3 ORM - 基于两个不同相关表中的两列进行排序

提问于
浏览
0

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

更具体地说,我有一张图片表,有很多评论 . 我想根据评论和图片表的创建列中的最新时间戳对图片进行排序 .

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

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的顺序 . 我已经尝试在 - > contains(['Comments'])和最后一次匹配调用后链的最外部调用order函数 . 我似乎无法弄清楚如何将两个表相互关联,以便我可以对它们进行排序 .

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

任何人都可以给我一些指导如何解决这个问题?

1 回答

  • 0

    首先,你的目的应该是明确的 . 哪种订购优先考虑? Pictures.createdComments.created ?您无法根据这两者对结果进行排序 . 当你做这样的事情:

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

    订单仅保证 Comments.created . 如果两条评论有相同的时间,那么它们按 Pictures.created 排序 .

    还有另外一件事要考虑 . 在更加填充的对象上构建查询 . 如果每个 Picture HasMany Comments 尝试在 Comments 上构建您的查询 . 在 Pictures 上构建查询时,我不知道结果如何排序 . 因为检索到的记录不是按 Pictures.id 排序,但是当结果转换为对象模型时,“注释”将嵌套在“图片”中,之前的排序将被处理掉 .

    最后,不要提高性能,否则会降低代码的可读性 . 因此,如果您要执行php逻辑首先检索所有数据,然后使用几个简单的 foreach es处理它 .

相关问题