2016-11-02 14 views
0

ダッシュボードでチャットアプリケーションを構築し、他のユーザーが最後に送信したメッセージの通知を取得しようとしています。ここでGroupByとOrderBy Laravel Eloquent

は私のモデルとの関係である:事で

public function messages() { 
    return $this->hasMany('App\Message', 'author_id'); 
} 

public function lastMessage() { 
    return $this->hasMany('App\Message', 'recipient_id')->orderBy('created_at', 'DESC')->groupBy('author_id'); 
} 

私が把握傾ける代わりに、それはORDERBYを使用してソートされなければならないとしての最後のメッセージを返すのではなく、中に存在して、そのグループの最初のレコードを返しますデータベース。

オンラインで見ることはできますが、これについての情報は見つかりませんでした。私が見つけた唯一の事は、ラベールのorderByとgroupByがうまく一緒に遊ばないと言った人の投稿です。

ご協力いただきましてありがとうございます。

答えて

0

lastMessageでリレーションを再定義する代わりに、messagesを呼び出してからクエリを実行してみてください。

モデルスキーマ(すなわち:これらの関係が定義されている??)の多くを見ることなく、これは完璧ではないかもしれませんが、それはスタートだ:

public function lastMessage() 
{ 
    return $this->messages() // <-- Notice the()...this creates a query instead of immediately returning the relationship 
     ->where('recipient_id', $this->id) // Not sure if this is correct, might need to adjust according to how you have defined the tables 
     ->orderBy('created_at', 'desc') 
     ->first(); 
} 

それはチェーンとのmessages関係を照会しますリストされている制約。 first()を返すことで、コレクションではなくレコードが1つだけ返されます。

+0

私は何かを考え出すことができるかどうかを今夜あなたの提案と一緒に遊びます。私は1つのメッセージを検索するつもりはない、私は通知に入れるためにすべてのアクティブな会話のための最後の新しいメッセージを取得するために探しています。だから、3人のユーザーが私が持っていた会話に戻ってきたときは、それらのメッセージをFacebookに似た「新しい通知」として正しく表示します。私はそれが理にかなったことを願うだから私はgroupBy()を使っているのです – max234435