在laravel中以雄辩的方式获得每个相关模型的最大值

时间:2014-09-04 00:02:37

标签: laravel eloquent

我有2个型号:

class Message extends Eloquent {

    public function conversation(){
        return $this->belongsTo('Conversation', 'conversationId');
    }


    public function sender(){
        return $this->belongsTo('User', 'senderId')->select('id', 'userName');
    }


    public function receiver(){
        return $this->belongsTo('User', 'receiverId')->select('id', 'userName');
    }
}

class DeskConversation extends Eloquent {

}

我想要的是获取每个对话的所有最后消息(包含在给定数组中的那些消息)...换句话说,我想进行一些对话,并且对于每个对话,只有最后一条消息是交换。

我能够通过以下方式获取所有给定对话的所有消息:

return Message::whereHas('conversation', function($query) use ($convIds) {
    $query->whereIn('id', $convIds);
})->with('sender')->with('receiver')->orderBy('conversationId')->orderBy('id', 'DESC')->get();

其中$convIds是一组ids。

如何为每个对话仅拍摄最后一条消息?

P.S。两个模型都有时间戳字段。

1 个答案:

答案 0 :(得分:3)

这就是你需要的:

/**
 * Conversation has one latest Message
 *
 * @return Illuminate\Database\Eloquent\Relations\HasOne
 */
public function latestMessage()
{
    return $this->hasOne('Message')->latest();
}

然后只是:

$conversations = Conversation::with('latestMessage')->get();
// then each latest message can be accessed:
$conversation->latestMessage;
$conversations->first()->latestMessage;