1
votes

Comment puis-je montrer à un utilisateur dans Laravel une question qui n'a pas été consultée auparavant?

J'ai deux tables utilisateurs et questions
Le tableau questions contient plus de 5 000 questions qui peuvent être consultées par les utilisateurs.
Je souhaite qu'un utilisateur affiche une question aléatoire à la fois et une seule fois,
Une fois la question consultée par un utilisateur, elle ne doit plus être consultée par cet utilisateur en particulier.

Exemple de tableau utilisateurs :

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

Exemple du tableau questions :

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

J'ai donc créé une autre table nommée skips qui stocke le question_id code consulté > et user_id
table contient les colonnes user_id et question_id

Exemple de table skips :

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

Par exemple: user_id du numéro 1 a déjà vu les deux questions avec les identifiants 1 et 2

Maintenant, voici ma question
Comment puis-je montrer à un utilisateur dans Laravel une question qui n'a pas été consultée auparavant à l'aide de relations éloquentes?


3 commentaires

Astuce: vous pouvez utiliser pas dans


@catcon quelque chose comme ceci: Question :: all () -> where Not In ('skips', ...) -> random (); ? Que dois-je passer aux sauts?


Je ne sais pas pour l'éloquent, mais cette requête fonctionne peut-être SELECT * FROM question WHERE question_id not in (sélectionnez question_id parmi les sauts où user_id = 1)


3 Réponses :


1
votes

Vous pouvez utiliser whereNotIn () et fournir une sous-requête dans laquelle vous sélectionnez toutes les questions auxquelles un utilisateur a répondu.

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

Si vous avez une relation appelée «saute» correctement définie (qui obtient les réponses aux questions), vous pouvez utiliser doesntHave () ,

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


0 commentaires

0
votes

Dans laravel, de nombreuses façons d'obtenir le résultat souhaité. relation est la meilleure solution.

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


1 commentaires

Vous ne définissez généralement pas de modèle de tableau croisé dynamique. C'est à cela que servent les relations.



1
votes

J'ai atteint cet objectif en:

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


0 commentaires