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 Réponses :
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();
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();
Vous ne définissez généralement pas de modèle de tableau croisé dynamique. C'est à cela que servent les relations.
J'ai atteint cet objectif en:
Question::whereNotIn('id', Skip::where('user_id', Auth::user()->id)
->get('question_id'))
->get()
->random();
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)