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

Laravel如何获取已认证用户投票过的问题列表(仅返回问题)

解决方案:获取已认证用户投票过的纯问题列表

当然可行!Laravel的Eloquent ORM提供了多种简洁的方式来实现这个需求,下面我给你两种常用的方案,你可以根据自己的代码结构选择:

方案一:使用hasThrough关联(推荐,更高效)

这种方式通过一次数据库查询直接获取用户投票过的问题,避免额外的集合操作。

1. 完善User模型的关联

在User模型中定义一个关联方法,通过Vote模型间接关联到Question:

// app/Models/User.php
public function votedQuestions()
{
    return $this->hasThrough(
        Question::class,
        Vote::class,
        'user_id', // Votes表中关联User的外键
        'id',      // Questions表的主键
        'id',      // Users表的主键
        'question_id' // Votes表中关联Question的外键
    );
}

2. 在控制器中查询并返回结果

直接通过认证用户的关联方法获取问题,并用select确保只返回问题表的字段:

// 控制器方法
public function getVotedQuestions()
{
    $votedQuestions = auth()->user()->votedQuestions()
        ->select('questions.*') // 明确只取Questions表的所有字段
        ->get();

    return response()->json($votedQuestions);
}

方案二:通过Vote模型关联查询(适合已有Vote关联的场景)

如果你的代码中已经用到了User和Vote的关联,也可以通过Vote模型反向关联到Question,再提取问题数据:

1. 确保Vote模型的关联正确

确认Vote模型中已经定义了与Question的关联:

// app/Models/Vote.php
public function question()
{
    return $this->belongsTo(Question::class);
}

2. 控制器中查询并提取问题

先查询当前用户的所有投票,预加载关联的Question,再通过集合操作提取并去重问题:

// 控制器方法
public function getVotedQuestions()
{
    $votedQuestions = Vote::where('user_id', auth()->id())
        ->with('question') // 预加载Question,避免N+1查询
        ->get()
        ->pluck('question') // 提取所有关联的Question对象
        ->unique('id'); // 去重,防止同一问题被多次投票的情况

    return response()->json($votedQuestions);
}

关键说明

  • 两种方案都能确保返回的JSON仅包含Question表的原始数据,不会携带Vote相关的字段。
  • 方案一的hasThrough是单次数据库查询,性能更优;方案二更灵活,适合需要对Vote数据做额外处理的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:09:09