2017-10-20 2 views
1

Wer weiß, wie diese Abfrage roh Querybuilder zu konvertieren:Convert MySQL Query DB :: raw Abfrage

SELECT 
    A.ID_KANWIL, 
    COUNT(A.ID_CABANG) AS CABANG, 
    SUM(JUMLAH_KARYAWAN) AS JMLKARYAWAN, 
    COALESCE(B.JML_PESERTA, 0) AS JMLPESERTA 
FROM ORGANISASI A 
    LEFT JOIN (
     SELECT 
      ID_KANWIL, 
      SUM(JUMLAH_PESERTA) AS JML_PESERTA 
     FROM CAKUPAN 
     WHERE 
      BULAN=6 
      AND TAHUN=2017 
      AND ID_PROGRAM=1 
     GROUP BY 
      ID_KANWIL, 
      ID_PROGRAM 
    ) B ON A.ID_KANWIL=B.ID_KANWIL 
WHERE 
    A.BULAN=6 
    AND A.TAHUN=2017 
GROUP BY 
    A.ID_KANWIL, 
    A.BULAN, 
    A.TAHUN 

ich das versucht hatte,

$data=colletc(DB::select(DB::raw("SELECT 
    A.ID_KANWIL, 
    COUNT(A.ID_CABANG) AS CABANG, 
    SUM(JUMLAH_KARYAWAN) AS JMLKARYAWAN, 
    COALESCE(B.JML_PESERTA, 0) AS JMLPESERTA 
FROM ORGANISASI A 
    LEFT JOIN (
     SELECT 
      ID_KANWIL, 
      SUM(JUMLAH_PESERTA) AS JML_PESERTA 
     FROM CAKUPAN 
     WHERE 
      BULAN=6 
      AND TAHUN=2017 
      AND ID_PROGRAM=1 
     GROUP BY 
      ID_KANWIL, 
      ID_PROGRAM 
    ) B ON A.ID_KANWIL=B.ID_KANWIL 
WHERE 
    A.BULAN=6 
    AND A.TAHUN=2017 
GROUP BY 
    A.ID_KANWIL, 
    A.BULAN, 
    A.TAHUN")))->get() 

aber ich habe Fehler

Call to a member function get() on array 

Antwort

0

verwenden Sie die ->get() auf der "colletc" Funktion

entfernen -> get() es

arbeiten sollte ich vorschlagen, dass Sie die Modell Beziehungen zu verwenden, und Sie brauchen nicht querys zu machen, wie Sie

+0

erhalten Dank @peter, ich habe ersetzen -> get() mit allen(), das ist perfekt arbeiten. –

0

tun Versuchen Sie, diese

$data = DB::select(
    " 
    SELECT A.ID_KANWIL, 
     COUNT(A.ID_CABANG) AS CABANG, 
     SUM(JUMLAH_KARYAWAN) AS JMLKARYAWAN, 
     COALESCE(B.JML_PESERTA, 0) AS JMLPESERTA 
    FROM ORGANISASI A 
    LEFT JOIN 
    (
    SELECT ID_KANWIL, 
      SUM(JUMLAH_PESERTA) AS JML_PESERTA 
    FROM CAKUPAN 
    WHERE BULAN = :param1 
     AND TAHUN = :param2 
     AND ID_PROGRAM = 1 
    GROUP BY ID_KANWIL, 
       ID_PROGRAM 
    ) B 
    ON A.ID_KANWIL = B.ID_KANWIL 
    WHERE A.BULAN = :param3 
    AND A.TAHUN = :param4 
    GROUP BY A.ID_KANWIL, A.BULAN, A.TAHUN 
    ", 
    [ 
    "param1" => $bulan, 
    "param2" => $tahun, 
    "param3" => $bulan, 
    "param4" => $tahun, 
]); 

Diese Abfrage wird mit Benannte Bindungen erstellt. Sie können mehr lesen über sie here

In der Abfrage Wort :param1 wird mit dem Wert von $bulan

:param2 mit $tahun ...

:param1 in der Abfrage ersetzt ersetzt werden muss Schlüssel des Arrays entsprechen als zweites Argument zu DB::select() (was in diesem Fall ist "param1" => $bulan,)

Als eine Sache, die Sie wissen müssen, ist, wenn Sie die gleichen verwenden möchten $bulan v Ariable wieder, müssen Sie neue mit :param3, die den Wert von "bulan3" => $bulan,

+0

Vielen Dank, verru viel, ich habe Fehler, .. und ich gebe DB :: Raw (vor db :: select). und arbeiten Sie gut –

+0

Seien Sie vorsichtig, wenn Sie 'DB :: raw()' verwenden, besonders wenn Sie Variablen (Beispiel '$ bulan') innerhalb der Abfrage übergeben. Das könnte dich offen lassen für [sql injection] (https://stackoverflow.com/questions/601300/what-is-sql-injection). Deshalb habe ich Ihnen eine Lösung zur Verfügung gestellt, die ** Named Bindings ** verwendet. – ljubadr

+0

Haben Sie 'DB :: select (DB :: raw (" query .... "))' '? Wenn ja, werde ich die Antwort aktualisieren. – ljubadr