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

Laravel开发需求:检测用户15天内广告创建数并添加表格行样式

解决Laravel中检测用户15天内广告数量并添加表格行样式的问题

我来帮你搞定这个问题!核心思路是提前在控制器中高效统计每个用户过去15天内的广告数量,避免在视图中重复查询导致性能问题,然后在Blade模板中根据统计值动态添加样式类。下面是具体实现步骤:

1. 确保模型关联正确

首先确认你的User模型和Aviso模型(对应广告表)已经建立了正确的关联:

// app/Models/User.php
public function avisos()
{
    return $this->hasMany(Aviso::class); // 假设Aviso模型的外键字段是user_id
}

2. 控制器中预统计用户近期广告数

在获取广告列表时,用withCount给每个关联的用户附加一个“15天内广告数量”的统计字段,这样只需要一次数据库查询就能完成统计:

// 你的控制器方法示例
public function index()
{
    $avisos = Aviso::with(['user' => function ($query) {
        // 给用户添加recent_avisos_count字段,统计过去15天内创建的广告数
        $query->withCount([
            'avisos as recent_avisos_count' => function ($q) {
                $q->where('created_at', '>=', now()->subDays(15));
            }
        ]);
    }])->get();

    return view('avisos.index', compact('avisos'));
}

3. Blade视图中动态添加样式类

遍历广告列表时,直接读取用户的recent_avisos_count字段,判断是否大于1,给表格行添加对应的样式类:

<!-- resources/views/avisos/index.blade.php -->
<table>
    <thead>
        <!-- 表头内容示例 -->
        <tr>
            <th>广告标题</th>
            <th>发布用户</th>
            <th>创建时间</th>
        </tr>
    </thead>
    <tbody>
        @foreach($avisos as $aviso)
            <!-- 如果用户15天内广告数>1,添加highlight-row类(可自定义样式) -->
            <tr class="{{ $aviso->user->recent_avisos_count > 1 ? 'highlight-row' : '' }}">
                <td>{{ $aviso->title }}</td>
                <td>{{ $aviso->user->name }}</td>
                <td>{{ $aviso->created_at->format('Y-m-d H:i') }}</td>
                <!-- 其他列内容 -->
            </tr>
        @endforeach
    </tbody>
</table>

备选方案:预统计所有用户的近期广告数

如果不想在关联查询中嵌套统计逻辑,也可以单独查询所有用户的15天内广告数,存入数组后在视图中直接使用:

// 控制器方法示例
public function index()
{
    // 统计所有用户的15天内广告数,返回[id => 数量]的键值数组
    $userRecentAvisoCounts = User::select('id')
        ->withCount(['avisos' => function ($q) {
            $q->where('created_at', '>=', now()->subDays(15));
        }])
        ->pluck('avisos_count', 'id');

    $avisos = Aviso::with('user')->get();

    return view('avisos.index', compact('avisos', 'userRecentAvisoCounts'));
}

视图中使用方式:

<tr class="{{ $userRecentAvisoCounts[$aviso->user_id] ?? 0 > 1 ? 'highlight-row' : '' }}">
    <!-- 表格内容 -->
</tr>

常见问题排查

如果之前尝试后返回结果异常,可能是以下原因:

  • N+1查询问题:没有预加载用户关联,导致视图中每次访问$aviso->user都会触发新的数据库查询,统计结果不准确且性能低下。
  • 时间条件偏差:确认created_at字段的时区和now()一致(Laravel默认使用配置文件中的时区),避免时间范围判断出错。
  • 关联关系错误:检查User和Aviso模型的关联方法是否正确,外键字段是否与数据库表结构匹配。

内容的提问来源于stack exchange,提问作者aguisa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:04:58