Laravel格式查询json结果

时间:2016-10-28 15:15:34

标签: jquery mysql json laravel

我有一个如下所示的查询:

$messages = Conversation::leftJoin('v_sendermessages', 'v_conversations.con_id', '=', 'v_sendermessages.sm_c_id')
                                   ->leftJoin('v_recipientmessages', 'v_conversations.con_id', '=', 'v_recipientmessages.rm_c_id')
                                   ->where('con_id', $conId)
                                   ->select('v_conversations.sender_id', 'v_conversations.recipient_id', 'v_sendermessages.sender_message', 'v_sendermessages.date_sent', 'v_recipientmessages.recipient_message', 'v_recipientmessages.date_answered')
                                   ->get();

,输出结果为:

{
  "messages": [
    {
      "sender_id": 2,
      "recipient_id": 1,
      "sender_message": "Asdfasdfasdf",
      "date_sent": 1477664894,
      "recipient_message": "Sdfsdfsdf",
      "date_answered": 1477665242
    },
    {
      "sender_id": 2,
      "recipient_id": 1,
      "sender_message": "Asdfasdfasdf",
      "date_sent": 1477664894,
      "recipient_message": "Ju",
      "date_answered": 1477665442
    },
    {
      "sender_id": 2,
      "recipient_id": 1,
      "sender_message": "Asdfasdfasdf",
      "date_sent": 1477664894,
      "recipient_message": "Sdafasdf",
      "date_answered": 1477666240
    }
  ]
}

但是如何修改上面的查询以输出如下所示的json:

{
  "senderMessages": [
    {
    *sender messages listed here*
}],
"recipientMessages": [
{
    *recipient messages listed here*
]}

我使用此查询来显示对话,因此在一个部分列出所有发件人邮件和在另一部分列出所有收件人会更容易

1 个答案:

答案 0 :(得分:1)

我不认为你能够从一个查询中直接得到你想要的结果。您可以相对轻松地格式化已经返回的数据。但是,如果您决定不格式化数据,则只需运行两个查询,一个用于检索发件人,另一个用于检索收件人:

$messages['senderMessages'] = Sender::where('conversation_id', $conversationId)->get();
$messages['recipientMessages'] = Recipient::where('conversation_id', $conversationId)->get();

但是,我不认为这样做有任何意义,只要您知道发件人和对话,例如给予用户A和B的对话:

A: 'Hello'

B: 'Hi'

A: 'Fine weather we're having'

B: 'Yes it is'

在这种情况下,您当前的设置会将'Hi'作为对'Hello''Yes it is'的回复进行注册,作为对'Fine weather we're having'的回复,几乎就像他们两个独立交谈。如果用户在另一个用户响应之前发送2个消息,则会产生问题。

A: 'Hi'

A: 'How are you?'

B: 'Hello'

它是否将用户B的响应注册为对第一条或第二条消息的响应?这会导致问题吗?

只要你知道发送邮件的时间戳,发送邮件的人以及它所属的对话(这可以通过您使用或仅基于recipient_id的conversation_id找到),那么不需要收件人邮件。您可以完全删除收件人邮件表,并重命名' v_sendermessages'发送消息'然后找到指定了会话ID的消息。

由于你有sender_id,你可以用不同的方式处理用户,我不确定你想要的结果是什么,但如果是这样你就可以把用户A放在左边而B放在右边那个&# 39;完全可行,因为你可以看到他们的ids是不同的。这也可以将您的查询更改为简单:

$messages = Message::where('conversation_id', $conversationId)->get();