【问题标题】:How to get data by associative order?如何通过关联顺序获取数据?
【发布时间】:2021-06-08 12:30:41
【问题描述】:

我有两张桌子。

  1. 聊天室
  2. chat_pinned_rooms

chat_roomschat_room_idchat_pinned_roomshas_many 关系。

现在我想按chat_pinned_roomschat_rooms 数据进行排序(排序)。

我尝试了以下查询:

$this->ChatRooms->find()
    ->contain('ChatPinnedRooms', function ($q) {
            return $q
                ->where(['user_id' => $this->Auth->id])
            ;
        })
    ->order([
        'ChatRooms.ChatPinnedRooms.id' => 'ASC'
    ])
    ->all()
;

如果我在包含中使用此顺序,它只会对这些关联中的数据进行排序。但我需要按关联顺序对父表数据(chat_rooms)进行排序。

【问题讨论】:

  • 你有一个逻辑问题要先解决!您有一个1:n 关联,每个聊天室可以有很多固定房间,那么您想按这些固定房间行的id 列中的哪一个进行排序,为什么?首先尝试弄清楚如何使用原始 SQL 解决问题,然后从那里开始并将内容转换到查询构建器通常会更容易。
  • @ndm 实际上,我想拥有固定在顶部的聊天室和未固定在底部的聊天室。所以,如果我有十个聊天室,其中两个是固定的。我想在顶部显示这两个固定的聊天室。
  • 我不确定我是否理解正确,您想先对那些有 1 个或多个关联 ChatPinnedRoomsChatRooms 进行排序?
  • @ndm 是的!你是绝对正确的。

标签: cakephp cakephp-4.x


【解决方案1】:

如果您想首先对确实有 1 个或多个关联 ChatPinnedRoomsChatRooms 进行排序,那么您可以加入 ChatPinnedRooms 关联,为每个 ChatRooms.id 创建组,然后根据例如这些组中ChatPinnedRooms 的计数,大致如下:

$query = $this->ChatRooms
    ->find()
    ->leftJoinWith('ChatPinnedRooms', function ($q) {
        return $q
            ->where(['user_id' => $this->Auth->id]);
    })
    ->group('ChatRooms.id')
    ->orderAsc(function (
        \Cake\Database\Expression\QueryExpression $exp,
        \Cake\ORM\Query $q
    ) {
        return $exp->gte(
            $q->func()->count('ChatPinnedRooms.id'),
            1
        );
    });
LEFT JOIN ... ChatPinnedRooms ...
GROUP BY ChatRooms.id
ORDER BY COUNT(ChatPinnedRooms.id) >= 1 ASC

(如果您想在结果中包含固定的房间,您也需要contain() 它们,就像在您的示例中一样)或者您可以使用计数器缓存,以便在@987654333 中有一个具体的列@ 保存关联记录的计数,然后您可以将其用于排序,例如:

// in `ChatPinnedRoomsTable` class
$this->addBehavior('CounterCache', [
    'ChatRooms' => ['chat_pinned_rooms_count'],
]);
$query = $this->ChatRooms
    ->find()
    ->order([
        'chat_pinned_rooms_count >=' => 1,
    ]);

另见

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2015-09-18
    • 1970-01-01
    相关资源
    最近更新 更多