2015-06-22 24 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)。这将带来额外的好处,它还会净化你的班级名称,并确保它是一个真正的班级。