2014-01-05 58 views
7

運行RAW SQL查詢我試圖讓該查詢如何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; 
       " 

但結果卻是 「SQLSTATE [HY000]:常規錯誤」 的結果。

爾康版本:1.2.4

探查日誌:

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 

問題解決了:我創建存儲過程並插入所有查詢。 接下來我在PHP腳本中調用存儲過程。

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

你可以回答你自己的問題,與答案,發表您的解決方案 – mosid

回答

8

我看到的只是你的SQL,你想展示你如何試圖在phalcon中運行它嗎?

其中之一,你可以運行原始的SQL語句,而無需使用模型或元數據的簡單的方法是使用一個基礎適配器,在這個例子中,我將使用PDO:

 $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

我用這個方法太,但結果'「SQLSTATE [HY000]:常規錯誤」'。 –

+0

在我的Phalcon版本中,我必須使用''dbname'=>'whatever'',''database''似乎是一箇舊字段名稱:) –

+0

@ Stephane.P謝謝 - 此答案與phalcon 1有關。 x,我已經更新了我的答案以反映新版本,因爲答案本身仍然相關 –

5

documentation

如果原始的SQL查詢是在你的應用程序的通用方法 可以添加到模型常見的有:

<?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上david.duncan,工作版的答案:P(缺少逗號加入+陣列打印)

$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

要運行的控制器上的原始SQL:

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

要運行模型上的原始SQL:

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

爲modelsManager你需要安裝在您的服務(service.php)

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