0

Laravel version:7.0

I am going to get list from Guest model.

guests table: id, name, status, created_at, updated_at

$guests = Guest::orderby("status")->get();

Here is messages table.

$messages table: id, message, from_id, from_type, to_id, to_type

from_type, to_type can be either guest or user.

If I get latest message with lazy loading, I can get as following.

  foreach($guests as $guest)
  {
    $lastMessage = Message::where(function($query) use($guest){
                      $query->where("from_id", $guest->id);
                      $query->where("from_type", "guest");
                  })
                  ->orWhere(function($query) use($guest){
                       $query->where("to_id", $guest->id);
                       $query->where("to_type", "guest");
                  })->latest()->first();
  }

However, I know this is crazy. How can I get this with Eager loading?

Can anyone please give me some instruction?

LoveCoding
  • 1,121
  • 2
  • 12
  • 33

1 Answers1

0

One solution is to add it as an attribute in the user model as following

public function getLatestMessageAttribute()
        {
            return Message::where(function($query) use($guest){
                          $query->where("from_id", $this->id);
                          $query->where("from_type", "guest");
                      })
                      ->orWhere(function($query) use($guest){
                           $query->where("to_id", $this->id);
                           $query->where("to_type", "guest");
                      })->latest()->first();
        }

Then you need to add to $append array:

protected $appends = ['latest_message'];
Ziad Adeela
  • 466
  • 4
  • 10