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_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();
但是,我知道这很疯狂。如何通过 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 - 仅加载特定列
关于Eager用Laravel Eloquent Model中的选择过滤器加载