如何在Laravel中向用户显示以前未查看的问题?

时间:2019-09-25 05:31:44

标签: php laravel laravel-5

我有两个表usersquestions
questions表中有5000多个问题,用户可以查看。
我希望一个用户一次只能查看一次随机问题,
用户查看问题后,该特定用户不应再次查看该问题。

users表的示例:

id | name        | email
-------------------------
 1 | John Doe    | abc@example.com
 2 | Mary        | def@example.com

questions表的示例:

id | title       | description
-------------------------
 1 | ABC         | Some dsc
 2 | DEF         | Some dsc

因此,我创建了另一个名为skips的表,该表存储了已查看的question_iduser_id
表具有user_idquestion_id

skips表的示例:

id | user_id     | question_id
-------------------------
 1 | 1           | 1
 2 | 1           | 2

例如:编号user_id的{​​{1}}已经查看了ID为1和2的两个问题

现在这是我的问题
我如何在Laravel中向用户显示以前无法使用雄辩的关系查看的问题?

3 个答案:

答案 0 :(得分:1)

您可以使用whereNotIn()并提供一个子查询,您可以在其中选择用户已回答的所有问题。

Questions::whereNotIn('id', \DB::table("skips")
                               ->select("question_id")
                               ->where("user_id", \Auth::id()))
                               ->toArray()
         ->random();

如果您正确定义了一个称为“跳过”的关系(获得已回答的问题),则可以使用doesntHave()

Questions::doesntHave('skips')->random();

答案 1 :(得分:1)

我通过以下方式实现了这一目标

Question::whereNotIn('id', Skip::where('user_id', Auth::user()->id)
          ->get('question_id'))
          ->get()
          ->random();

答案 2 :(得分:0)

在laravel中,有很多方法可以达到您想要的结果。关系是最好的解决方案。

$skip = Skips::where('user_id', $user_id)->select('question_id')->toArray();
$questions = Questions::select(*)->whereNotIn('question_id', $skip)->toArray();