Autour de Laravel

Nombre d'enregistrement par objets et user

Avatar de PlySoft
PlySoft

Bonjour à tous, Je poursuis mon programme de gestion de ruches et je vous expose mon problème (de débutant, je vous préviens...)

j'ai une table user, une table ruche et une rucher. Les tables rucher et ruche sont reliées par l'id de user. image des 3 tables

La table ruche est aussi reliée par l'id de rucher. je compte le total de rucher et ruches par user avec les variables ci dessous :

    $ruchers = Ruchers::where('user_id', Auth::user()->id)->get();
     $ruchersCount = $ruchers->count();
     
     $ruches = Ruches::where('user_id', Auth::user()->id)->get();
     $ruchesCount = $ruches->count();
     

Maintenant que j'ai le total de ruches par user, je cherche à avoir le nombre de ruches par rucher pour l'user .

Merci pour votre aide.

Bonne journée à tous

Plysoft.

Posté il y a 1 mois
Avatar de Nicolus
Nicolus

Hello ! D'abord sur l'existant attention. Tel qu'est fait le code avec d'abord un ->get() (qui renvoie un collection) puis un ->count() (sur la collection donc), la requête va récupérer toutes les informations de tous les objets en faisant un gros SELECT *, puis php va compter le nombre d'objet dans la collection. Avec 10 éléments ça ne se remarque pas, mais quand tu auras un utilisateur qui a 10 000 ruches ça va mettre ton serveur à genoux dès la première requête.

Il vaudrait mieux faire

$ruchersCount = Ruchers::where('user_id', Auth::user()->id)->count()

Ensuite ce n'est pas très idiomatique en Laravel, et ça a l'inconvenient de mettre en dur le nom de la colonne "user_id" dans ton controleur (généralement je préfère éviter, comme ça si un jour on doit changer des noms de colonnes, on n'a que les modèles à modifier). Si tu fais correctement la relation Laravel "One to Many" entre utilisateur et ruchers, et utilisateur et ruches, tu pourras ensuite utiliser ces relations pour faire :

$ruchersCount = Auth::user()->ruchers()->count()
$ruchesCount = Auth::user()->ruches()->count()

Concernant la question de récupérer directement le nombre de ruches par rucher... Pour le coup je ne vois pas de moyen simple et facile avec Eloquent, et j'ai peur qu'il faille passer par un DB::raw comme montré dans la doc ici : https://laravel.com/docs/8.x/queries#raw-expressions , un truc du genre (j'ai pas testé du tout donc sans garantie) :

DB::table('ruches')
    ->select(DB::raw('count(*) as ruches_count, ruche_id'))
    ->where('user_id', Auth::user()->id)
    ->groupBy('rucher_id')
    ->get();

Mais pour le coup c'est pas très beau, j'espère que quelqu'un aura mieux à proposer ^^

Posté il y a 1 mois
Avatar de PlySoft
PlySoft

Bonjour,

Merci pour ton éclairage, c'est sympa

En effet, je reformule ruchercount.

Pour user_id, je vais réviser mes relations pour optimiser. Je suis en phase d'apprentissage...

Pour récupérer les ruches d'un rucher, je voyais en forearch mais je ne trouve pas cela très clean à l'intérieur d'un autre foreach qui liste les ruchers.

je pousuis ma recherche Merci !

Posté il y a 1 mois

Vous ne pouvez pas répondre à ce sujet.