如何在cakephp中组合来自两个模型的数据并按创建日期(时间对象)对它们进行排序?

问题描述 投票:0回答:1

消息和文件模型属于对话。 消息和文件都有一个创建的 DATETIME 字段。

我想选择属于特定对话的所有消息和文件,并根据创建日期将它们放入同一源中。

如何?

这是我尝试过的。

//Get us a conversation with all Files and Messages
$conversations = $this->Users->Conversations->find();
$conversations->contain([
  'Files' => function ($q)
             {
               return $q->order('Files.created ASC');
             },
  'Messages' => function ($q)
                {
                  return $q->order('Messages.created ASC');
                },
  'Messages.Users',
  ]);
  $conversations->where(['Conversations.id' => $conversationID]);

//Now we want to sort the files an messages according to created date
$converted = $conversations->toArray();
$allEntities = array_merge($converted[0]['files'],$converted[0]['messages']);
$allEntities = Hash::sort($allEntities,'{n}.created','asc');

这对于任何非时间对象的字段(例如 id)来说就像一个魅力。

我已经读过这个问题组合来自多个模型的数据列表并按在cakephp中创建的日期对它们进行排序

但是由于 cakephp 3 将日期时间转换为时间对象,我无法让 Hash::sort 工作。

一种方法可能是是否可以以某种方式关闭时间对象。这主要让事情对我来说更麻烦。

有什么建议吗?

php sorting cakephp cakephp-3.x
1个回答
1
投票

有什么建议吗?

将您的文件直接链接到

messages
表,而不是将它们链接到对话。您可以使用消息正文字段(或任何您所说的保存消息的字段)将任何数据序列化到其中(例如,如果您想稍后翻译这些值),或者只在其中包含一个文本字符串“Foo send File酒吧。”

如果您向消息表添加

message_type
字段,您可以使用该字段中的字符串来标识消息类型,例如
system

您当前的架构使其在数据库和应用程序级别上变得非常复杂,比必要的复杂得多。

© www.soinside.com 2019 - 2024. All rights reserved.