2015-06-22 27 views
0

我有一個數據對象相關的一些其他數據對象,我試圖爲他們建立一個報告頁面。SilverStripe 3左連接缺少參數

到目前爲止,我已經在我的頁面控制器中顯示了一個表單,我將開始爲報表選擇過濾選項。

但是我得到這個錯誤是由於左連接:

[注意]缺少論據2的SQLQuery :: addLeftJoin()

這似乎是在raw2sql正在輸出這當我已經調試:

\ 'AgeRangeData \' \ 'CallEvent.AgeRangeData ID = AgeRangeData.ID)\'

我假定反斜線是什麼原因造成的錯誤

public function ReportingFilter(){ 

    $DataObjectsList = $this->dbObject('DataObjects')->enumValues(); 

    $fields = new FieldList(
     new DropdownField('DataObjects', 'Data Objects', $DataObjectsList) 
    ); 

    $actions = new FieldList(
     new FormAction("FilterObjects", "Filter") 
    ); 

    return new Form($this, "ReportingFilter", $fields, $actions); 
} 

public function FilterObjects($data, $form){ 

    $data = $_REQUEST; 
    $query = new SQLQuery(); 

    $object = $data['DataObjects']; 
    $leftJoin = Convert::raw2sql("'" . $object . "', 'CallEvent." . $object . " ID={$object}.ID)'"); 

    $query->selectField("CallEvent.ID", "ID"); 
    $query->setFrom('`CallEvent`'); 
    $query->setOrderBy('CallEvent.Created DESC'); 
    $query->addLeftJoin($leftJoin); 

    return $query; 
} 
+0

沒有時間測試這些並將它們添加爲答案,但對於一些提示:Convert :: raw2sql應該用於轉換值(或數組)而不是完整的查詢語句。參見http://docs.silverstripe.org/en/3.1/developer_guides/security/secure_coding/。警告來自於你對addLeftJoin的使用,當它說缺少第二個參數時,它非常明確: $ query-> addLeftJoin($ leftJoin);應該或多或少 - > addLeftJoin($ tablename,$ joinstatement) –

+0

我的建議是在嘗試添加表格位之前使左連接與硬編碼值一起工作 –

回答

3

SQLQuery::addLeftJoin()有兩個參數。第一個是加入的表,第二個是「on」子句。

你想:

$query = new SQLQuery(); 
$query->addLeftJoin($object, '"CallEvent"."ID" = "' . $object . '"ID"'); 

你需要適當地逃脫$object,當然。


注意:您的代碼看起來有點脆弱如你不確保你$object實際上有一個數據庫表。我建議你使用ClassInfo::baseDataClass($object)。這將帶來額外的好處,它還會淨化你的班級名稱,並確保它是一個真正的班級。