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

Merhabalar
https://github.com/cviebrock/eloquent-taggable
paketini kullanıyorum
$posts = Post::where('status', true)
->orderByDesc('created_at')
->withAnyTags($tag)->paginate(20);

bu sekilde get ile gelen tag ı içeren postların listesine ulaşmaya calısıyorum.
localde problemsiz çalışıyor kodlarım fakat sunucuda hata alıyorum
dönen hata cıktısı
SQLSTATE[42000]: Syntax error or access violation: 1055 'guzelkadin.posts.user_id' isn't in GROUP BY

https://www.guzelkadin.com.tr/tags/kadin
direk linkten de hatayı görüntüleyebilirsiniz.

hatayı nasıl giderebilirim acaba localde hiç bir problem olmadan çalışıyor fakat sunucuda böyle durum

  • mgsmus bunu yanıtladı.
  • Serhatt Olayı anlamaya çalışalım. Bir takımda farklı sınıflardan öğrenciler var diyelim ve siz bunları sınıflara göre gruplayıp takımda her sınıftan kaç öğrenci var almak istiyorsunuz. Sorguyu yazdınız:

    SELECT class_name,
           count(*) AS students_count
    FROM   teams
    WHERE  id = 1
    GROUP  BY class_name 
    +------------+----------------+
    | class_name | students_count |
    +------------+----------------+
    | A          |              5 |
    | B          |             11 |
    | C          |              9 |
    +------------+----------------+

    Sorun yok. Şimdi siz buraya öğrenci adını da eklerseniz:

    SELECT class_name,
           count(*) AS students_count,
           name
    FROM   teams
    WHERE  id = 1
    GROUP  BY class_name 

    teams.name isn't in group by şeklinde aynı hatayı alırsınız çünkü burada veritabanı oraya ne getireceğini bilmiyor. Mesela A sınıfında 5 öğrenci gelmiş ama sadece birinin adını koyabilir. O yüzden sizden name alanını teke indirmek için ya aggregation'a tabi tutmanızı isteyecek (count, min, max, sum, avg...) ya da group by içine koymanızı isteyecek. Name alanına aggregation uygulayamazsınız (mantıksız, en fazla min/max ile sıralarsınız), group by içine koyarsanız da bu sefer isimleri göre de gruplama yapacağı için farklı bir sonuç alırsınız. Mesela kimsenin adı aynı değilse takımdaki öğrenci sayısı kadar kayıt gelir ve students_count değeri hepsinde 1 olur çünkü o sınıfta aynı isimden sadece 1 öğrenci var.

    Çözüm için strict false dediniz ve ONLY_FULL_GROUP_BY özelliğini iptal ettiniz. Hata vermez ama size şöyle bir sonuç verir:

    +------------+----------------+-----------------+
    | class_name | students_count |      name       |
    +------------+----------------+-----------------+
    | A          |              5 | Zeynep Demir    |
    | B          |             11 | Ahmet Unutkan   |
    | C          |              9 | Şule Çelikdöver |
    +------------+----------------+-----------------+

    MySQL burada name alanını natural order dediğimiz kayıtların eklenme sırasına göre getirir. Tamam sorgu çalıştı ama name alanı ne alaka, Zeynep Demir sizin ne işinize yarayacak, aynı sınıftaki diğer 4 öğrenciden ne farkı var, gerçekten istediğiniz isim o mu, neye göre o?

    Bu şekilde bir durum söz konusu...

    Serhatt Merhaba, foruma hoşgeldiniz.

    MySQL sunucunuzda sql_mode değerinde ONLY_FULL_GROUP_BY özelliği ekli. Ya bu özelliği kaldıracaksınız ya da grup yapan alanları select ile seçeceksiniz. Select ile seçmek zor olacağı için sql_mode düzenlemesi daha mantıklı, o yüzden sql_mode için Google'da how to disable ONLY_FULL_GROUP_BY aratabilirsiniz. Elbette bu özelliğin ne olduğunu anlamanız ve kapattığınızda MySQL'in nasıl davrandığını öğrenmeniz yanlış sonuçlar almamanız adına faydalı olacaktır.

      mgsmus
      Öncelikle Hoşbuldum Teşekkürler.
      config.database te mysql 'strict' => false, yapınca sorun düzeldi
      fakat bunun diger alanlara herhangi bir zararı olurmu hocam acaba

        Serhatt Olayı anlamaya çalışalım. Bir takımda farklı sınıflardan öğrenciler var diyelim ve siz bunları sınıflara göre gruplayıp takımda her sınıftan kaç öğrenci var almak istiyorsunuz. Sorguyu yazdınız:

        SELECT class_name,
               count(*) AS students_count
        FROM   teams
        WHERE  id = 1
        GROUP  BY class_name 
        +------------+----------------+
        | class_name | students_count |
        +------------+----------------+
        | A          |              5 |
        | B          |             11 |
        | C          |              9 |
        +------------+----------------+

        Sorun yok. Şimdi siz buraya öğrenci adını da eklerseniz:

        SELECT class_name,
               count(*) AS students_count,
               name
        FROM   teams
        WHERE  id = 1
        GROUP  BY class_name 

        teams.name isn't in group by şeklinde aynı hatayı alırsınız çünkü burada veritabanı oraya ne getireceğini bilmiyor. Mesela A sınıfında 5 öğrenci gelmiş ama sadece birinin adını koyabilir. O yüzden sizden name alanını teke indirmek için ya aggregation'a tabi tutmanızı isteyecek (count, min, max, sum, avg...) ya da group by içine koymanızı isteyecek. Name alanına aggregation uygulayamazsınız (mantıksız, en fazla min/max ile sıralarsınız), group by içine koyarsanız da bu sefer isimleri göre de gruplama yapacağı için farklı bir sonuç alırsınız. Mesela kimsenin adı aynı değilse takımdaki öğrenci sayısı kadar kayıt gelir ve students_count değeri hepsinde 1 olur çünkü o sınıfta aynı isimden sadece 1 öğrenci var.

        Çözüm için strict false dediniz ve ONLY_FULL_GROUP_BY özelliğini iptal ettiniz. Hata vermez ama size şöyle bir sonuç verir:

        +------------+----------------+-----------------+
        | class_name | students_count |      name       |
        +------------+----------------+-----------------+
        | A          |              5 | Zeynep Demir    |
        | B          |             11 | Ahmet Unutkan   |
        | C          |              9 | Şule Çelikdöver |
        +------------+----------------+-----------------+

        MySQL burada name alanını natural order dediğimiz kayıtların eklenme sırasına göre getirir. Tamam sorgu çalıştı ama name alanı ne alaka, Zeynep Demir sizin ne işinize yarayacak, aynı sınıftaki diğer 4 öğrenciden ne farkı var, gerçekten istediğiniz isim o mu, neye göre o?

        Bu şekilde bir durum söz konusu...