2015-05-24 7 views
0

Я пытаюсь сделать основной твиттер-приложения для обмена сообщениями уравнения с Laravel 5.OrderBy в Laravel 5

Есть сообщения и отправителей. Я пытаюсь написать запрос, который отображает последние сообщения, отправителя и общее количество сообщений, отображаемых отправителем. Запрос должен показывать только последнее сообщение для каждого пользователя. например если один человек отправил 6 сообщений за последние 5 минут, он будет показывать только последний из них.

То, что я пытаюсь сделать красноречивым способом является:

  1. Запрос последние сообщения, GroupBy Sender
  2. Выберите отправителями имя, Join имя отправителя на запрос 1
  3. графа запроса сообщения GroupBy Sender, присоединяться к запросу 2

Этот процесс может быть принципиально неправильным.

Тогда, на мой взгляд, я бы сделал: Sender A - (31 сообщение), Привет, это мое сообщение.

ТАБЛИЦЫ

У меня есть 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, или на полу в моем подходе и что я должен выглядеть делать?

Если вы можете объяснить, как запрос и присоединиться к count() в Eloquent, это было бы невероятно.

+0

Используйте эту http://softonsofa.com/tweaking-eloquent-relations-how -to-get-latest-related-model /. 'Group by' и' order by' не работают вместе, как и ожидалось в MySQL. –

ответ

1

Вы можете достигнуть этого со следующими:

  1. Создание и impelement Sender класса
  2. Создание и внедрение класса Message

Sender Модель:

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; 
} 
Смежные вопросы