Laravel 通过 Eager 加载获取 Join 表中的最新字段

Posted

技术标签:

【中文标题】Laravel 通过 Eager 加载获取 Join 表中的最新字段【英文标题】:Laravel getting latest field in Join table with Eager loading 【发布时间】:2020-08-06 06:12:10 【问题描述】:

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

但是,我知道这很疯狂。如何通过 Eager loading 获得这个?

谁能给我一些指导?

【问题讨论】:

【参考方案1】:

一种解决方案是将其作为属性添加到用户模型中,如下所示

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'];

【讨论】:

不!这不是急于加载。

以上是关于Laravel 通过 Eager 加载获取 Join 表中的最新字段的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eager Loading - 仅加载特定列

Laravel Eager Loading - 总是好的?

关于Eager用Laravel Eloquent Model中的选择过滤器加载

与 first()/all() 链接时,Laravel Eager 加载缺失的关系

Laravel Eager Loading 删除子项的空值

Laravel Eager Loading 在单个注入模型上