我有两张table。
1.聊天室(_R)
1.聊天_固定_房间
聊天室通过chat_room_id
与固定聊天室具有has_many
关系。
现在我想按chat_pinned_rooms
对chat_rooms
数据进行排序。
我已经尝试了以下查询:
$this->ChatRooms->find()
->contain('ChatPinnedRooms', function ($q) {
return $q
->where(['user_id' => $this->Auth->id])
;
})
->order([
'ChatRooms.ChatPinnedRooms.id' => 'ASC'
])
->all()
;
如果我在contain中使用这个顺序,它只会对那些关联中的数据进行排序。但是我需要按关联顺序对父表数据(chat_rooms
)进行排序。
1条答案
按热度按时间kmynzznz1#
如果你想首先对那些有一个或多个关联
ChatPinnedRooms
的ChatRooms
进行排序,那么你可以加入ChatPinnedRooms
关联,为每个ChatRooms.id
创建一个组,然后根据这些组中ChatPinnedRooms
的数量进行排序,沿着于下面这样:第一个
(if如果您希望在结果中包含固定房间,则也需要对它们执行
contain()
操作,就像您的示例中那样)或者您可以使用计数器缓存,以便在ChatRooms
中有一个具体的列,用于保存关联记录的计数,然后可以使用该列进行排序,例如:第一个
另请参阅
*Cookbook〉数据库访问和ORM〉查询生成器〉使用leftJoinWith
*手册〉数据库访问和ORM〉查询生成器〉使用SQL函数
*Cookbook〉数据库访问和ORM〉查询生成器〉排序结果