You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:20:46