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)