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

Herkese merhaba,

Aşağıdaki sorguyu Eloquent'te nasıl yazarım? Ya da nasıl raw sorgu gönderebilirim?

SELECT gecen_ay,
    SUM(gecen_ay_satis_toplami) AS gecen_ay_satis_toplami
FROM (
    SELECT DATE_FORMAT(islem_tarihi, '%Y-%m') AS gecen_ay,
        SUM(toplam_tutar) AS gecen_ay_satis_toplami
    FROM sepetler
    WHERE DATE_FORMAT(islem_tarihi, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m')
    GROUP BY DATE_FORMAT(islem_tarihi, '%Y-%m')
    UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m') AS gecen_ay,
        0 AS gecen_ay_satis_toplami
) AS subquery
GROUP BY gecen_ay;
  • mavisland Bu tür durumlarda heredoc kullanın:

    $sql = <<<SQL
    SELECT gecen_ay,
        SUM(gecen_ay_satis_toplami) AS gecen_ay_satis_toplami
    FROM (
        SELECT DATE_FORMAT(islem_tarihi, '%Y-%m') AS gecen_ay,
            SUM(toplam_tutar) AS gecen_ay_satis_toplami
        FROM sepetler
        WHERE DATE_FORMAT(islem_tarihi, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m')
        GROUP BY DATE_FORMAT(islem_tarihi, '%Y-%m')
        UNION ALL
        SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m') AS gecen_ay,
            0 AS gecen_ay_satis_toplami
    ) AS subquery
    GROUP BY gecen_ay;
    SQL;
    
    $result = DB::select($sql);

    Mesela MySQL'de var mı bilmiyorum ama PostgreSQL'de tek tırnak kullandığınızda o ifadeyi değer olarak görürken çift tırnak kullandığınızda onu expression olarak görüyor, sütunmuş gibi işlem yapmaya çalışıyor hata veriyor. Bu durumda gerçekten çift tırnak kullanma gereği hissettiğinizde ve aynı anda tek tırnak da olması gereken durumlarda ise mecburen çift tırnakları \" şeklinde escape etmek zorunda kalıyorsunuz, DB::select("'...' \"...\""); gibi, bu da sorgu üzerinde karmaşaya sebep oluyor. Heredoc bunu çözüyor.
    https://php.net/manual/tr/language.types.string.php#language.types.string.syntax.heredoc

Saf sorgu göndermek isterseniz;

$gecen_ay_satislar = DB::select("SELECT gecen_ay,
    SUM(gecen_ay_satis_toplami) AS gecen_ay_satis_toplami
FROM (
    SELECT DATE_FORMAT(islem_tarihi, '%Y-%m') AS gecen_ay,
        SUM(toplam_tutar) AS gecen_ay_satis_toplami
    FROM sepetler
    WHERE DATE_FORMAT(islem_tarihi, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m')
    GROUP BY DATE_FORMAT(islem_tarihi, '%Y-%m')
    UNION ALL
    SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m') AS gecen_ay,
        0 AS gecen_ay_satis_toplami
) AS subquery
GROUP BY gecen_ay;");

    mavisland kümülatif sorgu mu yapmak istiyorsun
    1.ay için 10
    2.ay için 12(10 diğer ya 2 2.ay için)
    ...
    Şeklinde mi

      • mgsmus

        Seviye 1382
      • Düzenlendi
      • En İyi Yanıtmavisland tarafından

      mavisland Bu tür durumlarda heredoc kullanın:

      $sql = <<<SQL
      SELECT gecen_ay,
          SUM(gecen_ay_satis_toplami) AS gecen_ay_satis_toplami
      FROM (
          SELECT DATE_FORMAT(islem_tarihi, '%Y-%m') AS gecen_ay,
              SUM(toplam_tutar) AS gecen_ay_satis_toplami
          FROM sepetler
          WHERE DATE_FORMAT(islem_tarihi, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m')
          GROUP BY DATE_FORMAT(islem_tarihi, '%Y-%m')
          UNION ALL
          SELECT DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m') AS gecen_ay,
              0 AS gecen_ay_satis_toplami
      ) AS subquery
      GROUP BY gecen_ay;
      SQL;
      
      $result = DB::select($sql);

      Mesela MySQL'de var mı bilmiyorum ama PostgreSQL'de tek tırnak kullandığınızda o ifadeyi değer olarak görürken çift tırnak kullandığınızda onu expression olarak görüyor, sütunmuş gibi işlem yapmaya çalışıyor hata veriyor. Bu durumda gerçekten çift tırnak kullanma gereği hissettiğinizde ve aynı anda tek tırnak da olması gereken durumlarda ise mecburen çift tırnakları \" şeklinde escape etmek zorunda kalıyorsunuz, DB::select("'...' \"...\""); gibi, bu da sorgu üzerinde karmaşaya sebep oluyor. Heredoc bunu çözüyor.
      https://php.net/manual/tr/language.types.string.php#language.types.string.syntax.heredoc

        nuri60 Sogularımı hazırladım hocam. Günlük, Haftalık, Aylık, Geçen Ay, Yıllık, Ay bazlı vs. sorguları hallettim lakin direkt sorgu yazmak yerine Query Builder kullanabilir miyim merak ettim.

          mavisland Builder::fromSub ve Builder::unionAll() yöntemleri kullanılarak yazılabilir ama yaptığınız şekilde raw yazmak builder ile yapılandan daha anlaşılır kalacaktır 🙂

          DB::query()
              ->fromSub(
                  DB::table('sepetler')
                      ->selectRaw("
                          DATE_FORMAT(islem_tarihi, '%Y-%m') AS gecen_ay,
                          SUM(toplam_tutar) AS gecen_ay_satis_toplami
                      ")
                      ->whereRaw("DATE_FORMAT(islem_tarihi, '%Y-%m') = DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m')")
                      ->groupByRaw("DATE_FORMAT(islem_tarihi, '%Y-%m')")
                      ->unionAll(
                          DB::query()
                              ->selectRaw("
                                  DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m') AS gecen_ay,
                                  0 AS gecen_ay_satis_toplami
                              ")
                      ), 
                  'subquery'
              )
              ->selectRaw("
                  gecen_ay, 
                  SUM(gecen_ay_satis_toplami) AS gecen_ay_satis_toplami
              ")
              ->groupBy('gecen_ay')
              ->get();

          Şahsen raw olanı tercih ederim.

            mgsmus Query Builder'da hiç okunabilir durmuyor. Kaldı ki en küçük sorgulardan birisi bu. Heredoc işimi gördü hocam. Yardımınız için teşekkürler.