【问题标题】:OrderBy in Laravel 5Laravel 5 中的 OrderBy
【发布时间】:2015-08-06 05:58:25
【问题描述】:

我正在尝试使用 Laravel 5 制作一个基本的 twitter-eqs 消息应用程序。

有消息和发件人。我正在尝试编写一个查询来显示最新消息、发件人以及发件人显示的消息总数。查询应该只显示每个用户的最新消息。例如如果一个人在过去 5 分钟内发送了 6 条消息,则只会显示他们最新的一条消息。

我试图以 Eloquent 的方式做的是:

  1. 查询最新消息,GroupBy Sender
  2. 选择发件人姓名,将发件人姓名加入查询 1
  3. GroupBy Sender 的消息查询计数,加入查询 2

这个过程可能从根本上是错误的。

然后,在我看来,我会渲染:发件人 A -(31 条消息),您好,这是我的消息。

表格

我有两张桌子

发件人

ID |名称

消息

ID |发件人ID |留言 | Created_at

查询

$latestMessages = Sender::
join('messages', 'messages.sender_id', '=', 'senders.id')
->OrderBy('messages.created_at', 'asc')
->GroupBy('senders.id')
->get();

问题

这会输出最旧的消息,而不是最新的消息。 (另外,我不知道如何计算来自每个发件人的消息并加入这个)。

我尝试将“ASC”和“DESC”更改为无济于事。当我删除 GroupBy 时,它确实按所需顺序(从最新到最旧)显示消息,但我不知道如何只显示每个发件人 1 个。

问题 有人可以解释如何使用 Laravel 5 或我的方法中的地板以及我应该做什么来实现这一目标吗?

如果你能解释如何在 Eloquent 中查询和加入 count(),那就太棒了。

【问题讨论】:

  • 使用这个softonsofa.com/…Group byorder by 在 MySQL 中不能按预期一起工作。

标签: laravel eloquent laravel-5


【解决方案1】:

您可以通过以下方式实现:

  1. 创建并实现 Sender 类
  2. 创建和实现 Message 类

发件人模型:

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;
}

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2016-01-21
    • 2015-12-29
    • 2017-03-25
    • 2016-01-22
    • 2021-01-27
    相关资源
    最近更新 更多