Je veux faire une liste d'étudiants qui n'ont pas effectué de paiement au cours du mois en cours ou jamais effectué un paiement.
Il est possible de faire avec un seul constructeur de requêtes ou une fonction éloquente?
Avec le code ci-dessous, je peux faire exactement le contraire de ce que je veux: /
4 Réponses :
Je ne sais pas quelle valeur vous passez ici.
$indebted = DB::table('students')->where('students.active',1) ->leftJoin('payments', 'students.id', '=', 'payments.user_id') ->whereMonth('payments.created_at','=', 06) ->get();
Voici les ID étudiants qui ont effectué des paiements dans le mois et l'année actuels
$students = DB::table('students') ->whereNotIn('id',$payments) ->get();
Vous pouvez utiliser SQL brut dans ce type de situation Je suppose que vous utilisez la base de données MySQL
$sql=SELECT * from students s LEFT JOIN payments p ON s.id=p.user_id WHERE s.active=1 AND (p.created_at is NULL or MONTH(MAX(p.created_at) < MONTH(CURRENT_DATE())) ) $students = DB::connection('mysql')->select( DB::raw(" $sql")); foreach($students as $aStudent){ ... .... }
Vous pouvez obtenir des étudiants qui n'ont pas de paiements effectués dans ce mois
En fonction de la taille de vos données, l'utilisation de ces fonctions "assistant" est pourri pour l'optimisation de la base de données si vous n'exposez pas correctement vos données. Essentiellement, ils enveloppent la colonne de date autour d'une fonction, par exemple mois (paiements.Created_at) = '05' - cela forcera une analyse séquentielle sur cette colonne car la fonction est volatile. Pour l'optimiser, vous devrez créer des index fonctionnels "Créer une index IDX_BLAH sur les paiements (mois (créé_at))" ou faire une plage de date "-> où entre (" paiements.created_at ", [$ aujourd'hui-> startofmonsh, $ aujourd'hui-> endoftmonth]) (en supposant que $ aujourd'hui est une date de carbone)