在Laravel 5中订购

时间:2015-05-24 18:12:12

标签: laravel eloquent laravel-5

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

有消息和发件人。我正在尝试编写一个查询,显示最新消息,发件人和发件人显示的邮件总数。查询应仅显示每个用户的最新消息。例如如果一个人在最后5分钟内发送了6条消息,那么它只显示最新消息。

我想以雄辩的方式做的是:

  1. 查询最新消息,GroupBy Sender
  2. 选择发件人姓名,将发件人姓名加入查询1
  3. 查询邮件的数量GroupBy Sender,加入查询2
  4. 这个过程可能是根本错误的。

    然后,在我看来,我会渲染:发件人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(),那就太棒了。

1 个答案:

答案 0 :(得分:1)

您可以通过以下方式实现此目标:

  1. 创建和阻止发件人类
  2. 创建并实现Message class
  3. 发件人型号:

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