我正在尝试使用Laravel 5创建一个基本的twitter-eqs消息应用程序。
有消息和发件人。我正在尝试编写一个查询,显示最新消息,发件人和发件人显示的邮件总数。查询应仅显示每个用户的最新消息。例如如果一个人在最后5分钟内发送了6条消息,那么它只显示最新消息。
我想以雄辩的方式做的是:
这个过程可能是根本错误的。
然后,在我看来,我会渲染:发件人A - (31条消息),你好,这是我的信息。
TABLES
我有2张桌子
发件人
ID |名称
和
讯息
ID | SenderID |消息| Created_at
QUERY
$latestMessages = Sender::
join('messages', 'messages.sender_id', '=', 'senders.id')
->OrderBy('messages.created_at', 'asc')
->GroupBy('senders.id')
->get();
问题
这将输出OLDEST消息,而不是最新消息。 (另外,我无法弄清楚如何计算每个发件人的邮件并加入此邮件)。
我尝试过更改“ASC”和“DESC”无济于事。当我删除GroupBy时, 以所需的顺序显示消息(从最新到最旧),但我无法确定如何只为每个发件人显示1个。
问题 有人可以解释如何用Laravel 5实现这个目标,或者我的方法中的底线以及我应该做些什么?
如果您可以解释如何在Eloquent中查询和加入count(),那就太棒了。
答案 0 :(得分:1)
您可以通过以下方式实现此目标:
发件人型号:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Sender extends Model {
public function messages() {
return $this->hasMany('App\Message');
}
}
消息模型:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Message extends Model {
public function sender() {
return $this->belongsTo('App\Sender');
}
// Create scope http://laravel.com/docs/5.0/eloquent#query-scopes
public function scopeLatest($query) {
return $query->orderBy('created_at', 'asc');
}
}
所以现在你可以获取所有发件人,循环访问它们并显示他们的最新消息和总数如下:
$senders = Sender::with('messages')->all();
foreach ($senders as $sender) {
echo "Total Messages: " . $sender->messages->count();
echo "<br />";
echo "Latest message: " . $sender->messages()->latest()->first()->Message;
}