1
votes

Calculer la note moyenne d'un restaurant à Laravel

J'ai une table de restaurants avec les champs suivants

Schema::create('restaurants', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->timestamps();
            $table->string('name');
            $table->text('menu');
            $table->string('hours');
            $table->string('contact');
            $table->string('payment');

include rating_count qui stocke la note moyenne que j'ai ajoutée plus tard

[j'ai une table d'avis qui stocke la note de chaque restaurant]

https://i.stack.imgur.com /MXudX.png je veux calculer la note moyenne de chaque restaurant et l'afficher sur la vue des restaurants sous forme de nombre


6 commentaires

La capture d'écran que vous avez fournie n'a pas de champ numérique, comment calculerez-vous une moyenne?


@Jerodev il fait la colonne de notation


Y a-t-il une raison particulière pour laquelle ce message est marqué avec la balise jquery ?


D'accord, vous devriez peut-être l'inclure. Aussi, avez-vous encore essayé quelque chose?


la lame de révision contient du code jquery


@MatildahMariwa: il ne semble pas vraiment que vous cherchiez une solution javascript / jQuery. Je recommande de mettre la balise php à la place pour attirer plus de personnes capables de donner la réponse que vous recherchez.


3 Réponses :


1
votes

Ce dont vous avez besoin est de définir la relation dans votre modèle de restaurant comme ceci:

$restaurant->rating_count;

Ensuite, pour calculer la note, vous pouvez ajouter une autre méthode:

protected $appends = ['rating_count'];

public function getRatingCountAttribute()
{
    return $this->reviews->avg('rating');
}


7 commentaires

Dois-je mettre la note de méthode sur le modèle de restaurant ou sur le modèle de contrôleur?


dans le modèle Restaurant, oui.


j'ai besoin de stocker la note de chaque restaurant dans une colonne appelée rating_count dans le tableau des restaurants


Cela n'a aucun sens de stocker cette valeur dans la table, car chaque fois qu'une révision est entrée, vous devrez mettre à jour la table. Cela ressemble plus à une propriété calculée, jetez un œil à ma modification et utilisez-la à la place.


Veuillez accepter la réponse si elle vous a aidé à résoudre votre problème.


comment arrondir le nombre de notes à deux décimales?


@MatildahMariwa utilise number_format ($ restaurant-> rating_count, 2); .



0
votes

Récupérez tous les restaurants avec les avis.

foreach ($restaurants as $restaurant) {
    $restaurant->rating_count = $restaurant->reviews->avg('rating');
    $restaurant->save();
} 

Faites une boucle sur les restaurants et utilisez la méthode de collecte moyenne pour calculer le champ.

$restaurants = Restaurants::with('reviews')->get();

p>


0 commentaires

1
votes

Il est surtout préférable de garder vos méthodes de définition des relations aussi simples que possible dans votre modèle de restaurant.

$restaurant= Restaurant::first();

Vous pouvez maintenant utiliser cette relation pour obtenir le taux, vous pouvez ajouter une propriété qui n'est pas une colonne de votre modèle en tant que propriété ajoutée.

public functions getRateAttribute() {
     return $this->reviews->avg('rate') ?? 0;
}

et ensuite une fonction pour attribuer la valeur:

protected $appends = ['rate'];

Le problème avec ceci est qu'une propriété ajoutée comme son nom l'indique est toujours ajoutée à l'instance du modèle.

Donc, si vous faites simplement ce qui suit:

public function reviews() {
    return $this->hasMany('App\Review');
}
    de Laravel
  • Il donne null lorsqu'aucune donnée n'est présente
  • Cela donne une valeur comme 0,0 si vous faites la moyenne d'une colonne non numérique
  • Donne une valeur valide au format 3.9265 si la valeur présente est supérieure à 2 décimales (principalement 4)


0 commentaires