消息和文件模型属于对话。 消息和文件都有一个创建的 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 工作。
一种方法可能是是否可以以某种方式关闭时间对象。这主要让事情对我来说更麻烦。
有什么建议吗?
有什么建议吗?
将您的文件直接链接到
messages
表,而不是将它们链接到对话。您可以使用消息正文字段(或任何您所说的保存消息的字段)将任何数据序列化到其中(例如,如果您想稍后翻译这些值),或者只在其中包含一个文本字符串“Foo send File酒吧。”
如果您向消息表添加
message_type
字段,您可以使用该字段中的字符串来标识消息类型,例如 system
。
您当前的架构使其在数据库和应用程序级别上变得非常复杂,比必要的复杂得多。