2015-05-24 100 views
0

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

有消息和发件人。我试图编写一个查询,显示最新消息,发件人以及发件人显示的消息总数。查询应该只显示每个用户的最新消息。例如如果一个人在最近5分钟内发送了6封邮件,它只会显示最新的邮件。

我试图以雄辩的方式做的是:

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

此过程可能根本上是错误的。

然后,在我看来,我会渲染:发件人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(); 

问题

此输出最早的邮件,而不是最新的。 (另外,我不知道如何计算每个发件人的邮件并加入)。

我试过改变“ASC”和“DESC”无济于事。当我删除GroupBy时,它确实以所需的顺序(最新到最旧)显示消息,但我无法弄清楚如何仅显示每个发件人1个。

问题 有人能解释如何与Laravel 5,或者我的做法地板来实现这一点,我应该怎么办?

如果你可以解释如何查询和加入数量()的雄辩,这将是不可思议的。

+0

使用此http://softonsofa.com/tweaking-eloquent-relations-how获取最新相关模型/。 “按组”和“按顺序排列”不能像MySQL预期的那样一起工作。 –

回答

1

您可以通过以下实现这一点:

  1. 创建和教学贯彻发件人类
  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'); 
    } 
} 

所以,现在你可以得到所有的发件人,循环throught他们这样展示自己的最新消息,并总数:

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