2017-01-01 1 views
2

У меня есть следующий запрос, чтобы получить случайный вопрос из моей базы данных:Laravel - не показывают ту же запись дважды, используя inRandomOrder()

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

Каждый вопрос я генерации сохраняется в user_questions с следующая структура:

id | question_id | user_id 

Моя цель состоит в том, чтобы генерировать случайный вопрос, используя красноречивый выше запрос и исключить все вопросы, пользователь уже имеет.

Например, если имеются следующие записи в моей таблице user_questions:

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

запрос, возвращающие случайный вопрос исключая 133,134 и 543.

Любые идеи?

+0

Я думаю, вы должны найти способ, чтобы соответствовать извлеченный случайный запрос к массиву уже ответил один. Если в нем игнорировать, в противном случае, показывать пользователю. Если есть что-то вроде «ifExist», которое вы могли бы сделать, тогда вы проверяете столбец для некоторых данных, если они выходят, иначе попробуйте еще раз. – Rexford

ответ

2

Вы можете использовать whereDoesntHave(), чтобы исключить вопросы, которые пользователь уже имеет:

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

Я использовал ваш предыдущий ответ, используя 'whereNotIn ('id', $ questions)', и он сделал трюк. мои '$ questions' - это список всех вопросов, которые пользователь уже имеет. Я не мог понять ваш обновленный ответ, и если он сможет работать лучше. – TheUnreal

+0

Да, новый ответ более читабельен, я думаю, но 'whereNotIn()' также будет работать, если у вас уже есть идентификаторы пользователей. Рад, что это помогло.) –

Смежные вопросы