Laravel получение последнего поля в таблице соединения с активной загрузкой - PullRequest
0 голосов
/ 06 августа 2020

Laravel версия: 7.0

Я собираюсь получить список от модели Guest.

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

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

Вот messages таблица.

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

from_type, to_type может быть либо гостевым, либо пользователем.

Если я получаю последнее сообщение с отложенной загрузкой, я могу получить следующее:

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

Однако я знаю это безумие. Как я могу получить это при активной загрузке?

Кто-нибудь, пожалуйста, дайте мне какие-нибудь инструкции?

1 Ответ

0 голосов
/ 06 августа 2020

Одно из решений - добавить его в качестве атрибута в пользовательской модели следующим образом:

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

Затем вам нужно добавить в массив $ append:

protected $appends = ['latest_message'];
...