2

I am implementing chat like application in Laravel. I want to display latest 10 records like,

message 1
message 2
message 3
message 4
.
.
.

Here I am able to get latest 10 records from db and get data like,

message 10
message 9
message 8
message 7
.
.
.

I want reverse this order.

Controller method

public function getMessages(MeetupGroup $group)
{
    $messages   = $group->meetup_group_messages()->paginate(2);
    return response()->json(['messages' => $messages]);
}

Group Model

public function meetup_group_messages()
{
        return $this->hasMany('App\Models\MeetupGroupMessage\MeetupGroupMessage', 'meetup_group_id', 'id')->latest()->with('user');
}

I have checked reverse() but it works on model object not on query object. I am not getting how to reverse on this.

Ugnius Malūkas
  • 2,649
  • 7
  • 29
  • 42
AmarjaPatil4
  • 1,640
  • 3
  • 28
  • 41
  • 1
    Using latest() method, default result will be ordered by the "created_at" column. You may pass the column name that you wish to sort by. If you want to sort the result in Ascending order then you may use collection's sortBy() method on the result set. – Dev May 08 '18 at 06:05
  • `$group->meetup_group_messages()->orderBy(....)` would help but only if you have specific order requirements. Relational databases don't really have to maintain a specific order when inserting data – apokryfos May 08 '18 at 08:05

2 Answers2

2

Try Controller Method as:

use Illuminate\Support\Collection;

public function getMessages(MeetupGroup $group)
{
    $messages   = $group->meetup_group_messages()->paginate(2);
    return response()->json(['messages' => $messages->sortBy('Your_Column_name')->values()->all()]);
}

Or

public function getMessages(MeetupGroup $group)
{
    $messages   = $group->meetup_group_messages()->paginate(2);

    $records = collect($messages)->sortBy('Your_Column_name')->values()->all();

    return response()->json(['messages' => $records]);
}
Dev
  • 6,570
  • 10
  • 66
  • 112
1

There are a few problems with how you are going about doing this.

Follow the documentation for Naming Conventions of your Model, Controller and Migration. This answer simplifies naming conventions.

Your controller and model should also be a resource so that it is easily accessible through your Route. This also enables CRUD functionality. This can be achieved with an artisan command. This command also uses Laravel's Naming Convention for your database table, migration, controller and model, making it easy to follow best practices in Laravel development.

php artisan make:model Message --migration --controller --resource

Now add the resource to your routes/web.php file.

Route::resource('messages', 'MessagesController');

To review newly created resource routes, use this command:

php artisan route:list

You will then need to create 3 blade views, index, create and edit. I suggest creating a folder named "messages" to sort these views from others. Your controller will have an index function within it. It should look like this.

public function index()
{
  $messages = Message::orderBy('updated_at', 'asc')->paginate(2);
  return view('messages.index', compact('messages'));
}

Your index.blade.php file should contain this code:

@foreach($message as $message)
  <p>{{ $message->db_column_name1 }} </p>
  <p>{{ $message->db_column_name2 }} </p>
@endforeach
Mike Stratton
  • 463
  • 1
  • 7
  • 20