Laravel中如何筛选用户发布的未来日期Placement数据?
问题描述
我现有代码能展示用户发布的所有Placement数据,想把范围缩小到仅显示未来日期的Placement。尝试用where和Carbon::now实现但没生效,无报错但筛选条件不起作用。
当前展示所有Placement的代码
$placements = Auth::user()->placementsAuthored; $placements->load('keystage', 'subject', 'dates');
用户与Placement的关联方法
public function placementsAuthored() { return $this->hasMany(Placement::class, 'author_id'); }
我的尝试代码
$placements ->where('date','>',Carbon::now()->format('Y-m-d'));
解决方法
你的问题核心是没有在数据库查询阶段添加筛选条件,而是在已加载的集合上操作,且未保存过滤结果。以下是正确的实现方式:
基础场景(date是Placement表的字段)
直接通过关联查询构造器添加筛选,同时预加载关联模型:
$placements = Auth::user()->placementsAuthored() ->where('date', '>', Carbon::now()) ->with('keystage', 'subject', 'dates') ->get();
关键细节
- 调用
placementsAuthored()(带括号)返回查询构造器,此时的where会在数据库层面筛选,性能更优。 - 不用把
Carbon::now()转成字符串,Laravel会自动处理DateTime类型字段的比较,避免精度丢失。 - 用
with()预加载关联,比先查集合再load()少执行多次SQL查询,效率更高。
进阶场景(date在关联的dates表中)
如果未来日期存储在关联的dates表中,需要用whereHas筛选关联模型存在符合条件的记录:
$placements = Auth::user()->placementsAuthored() ->whereHas('dates', function ($query) { $query->where('date', '>', Carbon::now()); }) ->with('keystage', 'subject', 'dates') ->get();
内容的提问来源于stack exchange,提问作者Jac Phillipps
相关产品推荐
相关产品推荐

