2014-01-05 5 views
7

Ich versuche zu bekommen resultiert aus dieser AbfrageWie RAW SQL-Abfrage in PhalconPHP

$sql = " 
       SET @col = NULL; 
       SET @sql = NULL; 

       Select 
        Group_Concat(Distinct 
        Concat(
         'SUM(CASE WHEN tbl.sdate = ''', 
         colname, 
         ''' THEN tbl.result ELSE NULL END) AS ''', 
         colname,'''' 
        ) 
       ) Into @col 
       From (
        select concat(month(i.invdate),'.',year(i.invdate)) as colname 
        from invoices as i 
        where i.invtype = 1 and i.pid = 5 
        order by i.invdate 
       ) As collst; 

       SET @sql = CONCAT('SELECT tbl.wrkname,', @col, ' 
             FROM (
              Select wl.wgname As wrkname, Concat(Month(i.invdate),''.'',Year(i.invdate)) as sdate, Sum(id.qty * id.price) As result 
              From invoices As i 
               Join invoicedetails As id 
                On i.pchid = id.pchid 
               Join workgroups As w 
                On i.wid = w.wid 
               Join workgrouplist As wl 
                On w.wglid = wl.wglid 
              Where i.invtype = ', 1, ' And i.pid =', 5, 
              ' Group By i.pid, sdate 
              Order By i.invdate, wrkname 
             ) AS tbl 
             GROUP BY tbl.wrkname'); 

       PREPARE stmt FROM @sql; 
       EXECUTE stmt; 
       DEALLOCATE PREPARE stmt; 
       " 

aber Ergebnis war "SQLSTATE [HY000]: Allgemeiner Fehler" laufen.

Phalcon Version: 1.2.4

Profiler Protokoll ist:

SQL Statement: SET @col = NULL; SET @sql = NULL; Select Group_Concat(Distinct Concat('SUM(CASE WHEN tbl.sdate = ''', colname, ''' THEN tbl.result ELSE NULL END) AS ''', colname,'''')) Into @col From (select concat(month(i.invdate),'.',year(i.invdate)) as colname from invoices as i where i.invtype = 1 and i.pid = 5 order by i.invdate ) As collst; SET @sql = CONCAT('SELECT tbl.wrkname,', @col, ' FROM (Select wl.wgname As wrkname, Concat(Month(i.invdate),''.'',Year(i.invdate)) as sdate, Sum(id.qty * id.price) As result From invoices As i Join invoicedetails As id On i.pchid = id.pchid Join workgroups As w On i.wid = w.wid Join workgrouplist As wl On w.wglid = wl.wglid Where i.invtype = ', 1, ' And i.pid =', 5, ' Group By i.pid, sdate Order By i.invdate, wrkname) AS tbl GROUP BY tbl.wrkname'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 
Start Time: 1388927869.2788 
Final Time: 1388927869.2808 
Total Elapsed Time: 0.0019619464874268 

Problem gelöst: Ich gespeicherte Prozedur erstellen und alle Abfrage einfügen. Als nächstes rufe ich gespeicherte Prozedur in PHP-Skript.

$sql = "CALL GetReportByProjectBetweenDates(1, 5)"; 
$result = $this->db->query($sql); 
+1

Sie können Ihre eigene Frage, posten Sie Ihre Lösung mit Antworten beantworten – mosid

Antwort

8

Alles, was ich sehe, ist der SQL, wollen Sie zeigen, wie Sie versuchen, es in Phalcon zu laufen?

Einer der einfachen Möglichkeiten, wie Sie rohen SQL ohne Modelle oder Metadaten ausführen können verwendet, ist einen Basisteil zu verwenden, in diesem Beispiel werde ich PDO verwenden:

 $connection = new Phalcon\Db\Adapter\Pdo\Mysql(array(
       'host' => 'localhost', 
       'username' => 'user', 
       'password' => 'password', 
       'dbname' => 'optional' 
     )); 

     $connection->connect(); 

     $sql = 'select * from database.table'; 

     $result_set = $connection->query($sql); 
     $result_set->setFetchMode(Phalcon\Db::FETCH_ASSOC); 
     $result_set = $result_set->fetchAll($result_set); 
+1

ich diese Methode verwendet auch, aber Ergebnis '„SQLSTATE [HY000]: Allgemeiner Fehler“'. –

+0

In meiner Phalcon-Version muss ich ''dbname' => 'was auch immer'' verwenden, ''Datenbank' scheint ein alter Feldname zu sein :) –

+0

@ Stephane.P Danke - Diese Antwort bezieht sich auf phalcon 1. x, Ich habe meine Antwort aktualisiert, um neuere Versionen zu reflektieren, da die Antwort selbst noch relevant ist –

5

Vom documentation:

Wenn Raw SQL-Abfragen in Ihrer Anwendung eine generische Methode üblich sind zu Ihrem Modell hinzugefügt werden könnte:

<?php 

use Phalcon\Mvc\Model\Resultset\Simple as Resultset; 

class Robots extends Phalcon\Mvc\Model 
{ 
    public static function findByRawSql($conditions, $params=null) 
    { 
     // A raw SQL statement 
     $sql = "SELECT * FROM robots WHERE $conditions"; 

     // Base model 
     $robot = new Robots(); 

     // Execute the query 
     return new Resultset(null, $robot, $robot->getReadConnection()->query($sql, $params)); 
    } 
} 
2

basend auf die Antwort von david.duncan, Arbeits Ausgabe: P (fehlende hinzugefügt Kommas + Matrix-Druck)

$con = new Phalcon\Db\Adapter\Pdo\Mysql(array(
     'host' => 'localhost', 
     'username' => '', 
     'password' => '', 
     'dbname' => 'aDatabase' 
    )); 

    $con->connect(); 
    $sql = 'select * from aDatabase.aTable'; 
    $result = $con->query($sql); 
    $result->setFetchMode(Phalcon\Db::FETCH_ASSOC); 
    $result = $result->fetchAll($result); 

    foreach($result as $one) 
    { 
     echo print_r($one) . '<br>'; 
    } 
3

Um einen rohen SQL auf einem Controller auszuführen:

$this->db->query("SELECT * FROM robots WHERE id > 0"); 

a auszuführen raw sQL auf einem Modell:

$this->getDi()->getShared('db')->query("SELECT * FROM robots WHERE id > 0"); 
0
$sql = 'SELECT * from table'; 
$query = $this->modelsManager->createQuery($sql); 
$logs = $query->execute(); 

für modelsManager Sie müssen Setup in Ihrem Dienst (service.php)

$di->set('modelsManager', function() { 
     return new Phalcon\Mvc\Model\Manager\ModelsManager(); 
});