2017-07-26 5 views
0

Laravelの関数でgroupByを使用しようとしています。ここに私のクエリlaravelの雄弁で "with"関数を使ってgroupByを使うことは可能ですか?

$msgs=Conversation::where('sender', $sender) 
    ->orWhere('reciever', $sender) 
    ->orderBy('created_at', 'desc') 
    ->with('message') 
    ->get(); 

このクエリは、メッセージテーブルから多くのレコードを返します。ですが、私は一つだけを取得したいです。

これはデータであり、Iはグループに任意の助けが高く評価される

{ 
"data": [ 
    { 
     "id": 27, 
     "sender": 10, 
     "reciever": 4, 
     "created_at": "2017-07-26 22:46:04", 
     "updated_at": "2017-07-26 22:46:04", 
     "message": [ 
      { 
       "id": 5, 
       "conversation_id": 27, 
       "last_sender": 10, 
       "msg": "5", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:46:04", 
       "updated_at": "2017-07-26 22:46:04" 
      }, 
      { 
       "id": 6, 
       "conversation_id": 27, 
       "last_sender": 10, 
       "msg": "6", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:46:19", 
       "updated_at": "2017-07-26 22:46:19" 
      }, 
      { 
       "id": 7, 
       "conversation_id": 27, 
       "last_sender": 10, 
       "msg": "7", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:46:35", 
       "updated_at": "2017-07-26 22:46:35" 
      }, 
      { 
       "id": 8, 
       "conversation_id": 27, 
       "last_sender": 10, 
       "msg": "8", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:46:36", 
       "updated_at": "2017-07-26 22:46:36" 
      } 
     ] 
    }, 
    { 
     "id": 26, 
     "sender": 10, 
     "reciever": 7, 
     "created_at": "2017-07-26 22:40:02", 
     "updated_at": "2017-07-26 22:40:02", 
     "message": [ 
      { 
       "id": 1, 
       "conversation_id": 26, 
       "last_sender": 10, 
       "msg": "1", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:40:02", 
       "updated_at": "2017-07-26 22:40:02" 
      }, 
      { 
       "id": 2, 
       "conversation_id": 26, 
       "last_sender": 10, 
       "msg": "2", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:45:36", 
       "updated_at": "2017-07-26 22:45:36" 
      }, 
      { 
       "id": 3, 
       "conversation_id": 26, 
       "last_sender": 10, 
       "msg": "3", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:45:50", 
       "updated_at": "2017-07-26 22:45:50" 
      }, 
      { 
       "id": 4, 
       "conversation_id": 26, 
       "last_sender": 10, 
       "msg": "4", 
       "deleted": null, 
       "seen": null, 
       "created_at": "2017-07-26 22:45:57", 
       "updated_at": "2017-07-26 22:45:57" 
      } 
     ] 
    } 
] 

}

メッセージオブジェクトからの結果が欲しいです。物事が明確でない場合は教えてください。ありがとうございました。

答えて

1

代わりにこれでそれを置き換える「は」は:これは代わりに、メッセージのコレクションの一つだけ「メッセージ」を返します

$msgs=Conversation::where('sender', $sender) 
    ->orWhere('reciever', $sender) 
    ->orderBy('created_at', 'desc') 
    ->with(['message' => function ($query) { return $query->first();}]) 
    ->get(); 

。 コールバック関数の中には、それが何であるかを問わず適用することができます(押して選択してください...など)

+0

ありがとうございました。しかし、これは私が望むものではありません。このクエリは1に制限されていますが、結果をグループ化します。 'sender' =の' conversations'からselect *を選択すると、 "string(93)"というクエリが表示されている可能性があります。または 'reciever' =? 'created_at'によって"? "で'?messages'''conversation_id'が選択されましたdescend 1 " string(104)" select * by created_at' desc "string(104) 'messages'から' messages'.conversation_id'を 'created_at'のdesc limit 1" " – sadek

+1

で取得したと思いますので、コールバックの中に何でも適用できます( 'conversation_id'、['value1'、 'value2']) - > orderBy( '​​created_at')は、次のようになります: ' - > with(['message' => function($ query){ return $ query-> 、 'desc') - > first(); ' }]) – Sletheren

+0

もう一度ありがとうございます。しかし、運がない。これは私が "Conversation :: where( 'sender'、$ sender) - > orWhere( 'reciever'、$ sender) - > orderBy( '​​created_at'、 'desc') - > with([ 'message' => function($ query){ $ query-> whereIn( 'conversation_id'、['msg'、 'seen']); }])> get(); " メッセージオブジェクトには何も値を与えません。 私が気づいた事は、ほとんど何でも使用できますが、コールバックでgroupByを使用することはできません。 – sadek