Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Bir user tablom var, bir film tablom var ve filmlere kullanıcıların puan vereceği bir puan adında pivot tablom var. Kullanıcı oy verince pivot tabloya user id film id ve puanı tutuyorum. Filmleri listelerken puanını ve kaç kişinin puan verdiğini göstermek istiyorum. Nasıl yapılacağı kısmında sorunum yok doğru performanslı nasil yapılması gerektiğinde takıldım. Her oy verildiğinde modelde mi puanı oy sayısını toplayıp ortalamasını alıp film tablosuna eklemeliyim. Oy verildiginde controlerda mi yapmalıyım, withcount withavg kullanmaliyim
Veya başka bir yol mu kullanmaliyim, performans açısından en uygunu nedir?

    Codermania

        //model
        public function ratings(): BelongsToMany
        {
            return $this->belongsToMany(User::class)
                ->using(UserVote::class)
                ->withPivot('rating')
                ->withTimestamps();
        }
    
        //model
        public function updateRating(): void
        {
            $averageRating = $this->ratings()->avg('pivot.rating');
            $totalVotes = $this->ratings()->count();
    
            $this->update([
                'average_rating' => $averageRating,
                'total_votes' => $totalVotes
            ]);
        }
    
        //controller
        public function storeRating(Request $request, Film $film)
        {
            $request->validate([
                'rating' => 'required|numeric|min:1|max:5'
            ]);
            UserVote::upsert([
                'user_id' => auth()->id(),
                'film_id' => $film->id
            ], ['user_id', 'film_id']);
            Queue::push(function () use ($request, $film) {
                $film->updateRating();
            });
        }

    @"mgsmus" MYSQL hocam telefondan ayrı bilgisayardan ayrı google hesabıyla baglanıyorum 2 hesapta benim.

      aeneas Ayrı bir tablo daha oluşturun. Mesela film_ratings: film_id, vote_count, avg_rating. Buna genelde özet tablosu (summary table) denir. Bir filme oy verildiği zaman ya da (eğer izin veriyorsanız) kullanıcı oyunu değiştirdiği zaman hesaplama yapıp bu tabloyu güncelleyin ya da bunu veri tabanı düzeyinde yapan bir trigger yazın. Ekranda göstereceğiniz zaman bu tabloya join yaparsınız ya da eager loading kullanırsınız.

      PostgreSQL kullansaydınız Materialized View önerirdim.

      Hocam doğrumu düşünüyorum. Node js le bir trigger yazicam mesela express ile Sunucuda bir ters proxy oluşturucam, nuxt tarafından oy verildiğinde bu proxy ye bir post istedi aticam , pw2 ile portu dinleyip isteği yakalayıp triggeri çalıştırıcam. Veri tabanı islemlerini yaptıktan sonra nuxt tarafına dönmem ve fetch ile istek atıp güncel puanı ve kullanılan oy sayısıni alıp göstereceğim. Bu raya kadar tek cozemedigim şey nuxt tarafına nasıl geri döneceğim .

        Codermania MySQL triggerdan bahsediyorum: https://dev.mysql.com/doc/refman/8.4/en/trigger-syntax.html

        Mesela pivot tablonuz ratings olsun:

        +---------+---------+--------+
        | user_id | film_id | rating |
        +---------+---------+--------+
        |       1 |       1 |      8 |
        +---------+---------+--------+

        Özet tablonuz da ratings_summary olsun

        +---------+------------+------------+
        | film_id | vote_count | avg_rating |
        +---------+------------+------------+
        |       1 |        134 |        7.5 |
        +---------+------------+------------+
        DELIMITER //
        
        CREATE TRIGGER after_insert_rating AFTER INSERT ON ratings FOR EACH ROW
        BEGIN
            DECLARE new_vote_count INT;
            DECLARE new_avg_rating DECIMAL(5,2);
            
            -- Yeni eklenen film için oy sayısı ve ortalama puanı hesapla
            SELECT COUNT(*), AVG(rating) INTO new_vote_count, new_avg_rating FROM ratings
            WHERE film_id = NEW.film_id;
            
            -- Eğer ilgili film için summary kaydı varsa güncelle, yoksa ekle
            INSERT INTO ratings_summary (film_id, vote_count, avg_rating)
              VALUES (NEW.film_id, new_vote_count, new_avg_rating)
              ON DUPLICATE KEY UPDATE vote_count = new_vote_count, avg_rating = new_avg_rating;
        END;
        //
        DELIMITER ;

        Artık ratings tablosunda bir değişiklik olduğunda ratings_summary otomatik güncellenecek. Sonra mesela filmleri oylamalar ile birlikte almak isterseniz:

        SELECT f.id, f.title, rs.avg_rating, rs.vote_count
        FROM films AS f
        LEFT JOIN ratings_summary AS rs ON f.id = rs.film_id;

        Şimdi anladım hocam triggeri gorunce ben çok yanlış anlamışım.