Как я могу показать пользователю Laravel вопрос, который не просматривался ранее? - PullRequest
1 голос
/ 25 сентября 2019

У меня есть две таблицы users и questions
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_id и user_id
таблицы, в которых есть user_id и question_id столбец

Примериз skips таблица:

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

Например: user_id с номером 1 уже просмотрел оба вопроса с идентификаторами 1 и 2

Теперь вот мой вопрос
Как показать пользователю Laravel вопрос, который ранее не просматривался с использованием красноречивых связей?

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Я достиг этого путем:

Question::whereNotIn('id', Skip::where('user_id', Auth::user()->id)->get('question_id'))->get()->random();
1 голос
/ 25 сентября 2019

Вы можете использовать whereNotIn() и указать подзапрос, в котором вы выбираете все вопросы, на которые ответил пользователь.

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

Если у вас правильно определено отношение, называемое «пропуски» (которое получает ответов на вопросы), вы можете использовать doesntHave(),

Questions::doesntHave('skips')->random();
0 голосов
/ 25 сентября 2019

В Laravel много способов достичь желаемого результата.отношения - лучшее решение.

$skip = Skips::where('user_id', $user_id)->select('question_id')->toArray();
$questions = Questions::select(*)->whereNotIn('question_id', $skip)->toArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...