【问题标题】:Laravel - don't show the same record twice using inRandomOrder()Laravel - 不要使用 inRandomOrder() 两次显示相同的记录
【发布时间】:2017-05-15 22:12:04
【问题描述】:

我有以下查询从我的数据库中获取一个随机问题:

$q = Question::inRandomOrder()->first();

我生成的每个问题都保存在user_questions,结构如下:

id | question_id | user_id

我的目标是使用上面的 eloquent 查询生成随机问题,并排除用户已经提出的所有问题。

例如,如果我的 user_questions 表中有以下记录:

1 | 133 | 234
2 | 134 | 234
3 | 543 | 234

返回随机问题的查询,不包括 133,134 和 543

有什么想法吗?

【问题讨论】:

  • 我猜你必须找到一种方法来匹配检索到的随机查询与已经回答的数组。如果在其中,则忽略,否则,显示给用户。如果您可以执行“ifExist”之类的操作,则检查该列是否有一些数据,如果存在,请退出,否则,请重试。

标签: laravel eloquent


【解决方案1】:

您可以使用whereDoesntHave() 排除用户已有的问题:

$randomQuestion = Question::whereDoesntHave('users', function($q) use($userId) {
         $q->where('id', $userId);
    })
    ->inRandomOrder()
    ->first();

【讨论】:

  • 我一直在使用您之前的答案,使用whereNotIn('id',$questions),它成功了。我的$questions 是用户已有的所有问题的列表。我无法理解您更新后的答案,以及它是否可以表现更好。
  • 是的,我猜新答案更具可读性,但如果您已经拥有用户问题的 ID,whereNotIn() 也可以使用。很高兴它有帮助。 )
猜你喜欢
  • 1970-01-01
  • 2018-10-03
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
相关资源
最近更新 更多