2015-06-22 2 views
0

У меня есть объект данных, связанный с некоторыми другими объектами данных, и я пытаюсь создать для них страницу отчетности.SilverStripe 3 Left Join Missing аргумент

До сих пор у меня есть код ниже в моем контролере страницы, чтобы отобразить форму, где я начну выбирать параметры фильтрации для отчета.

Однако я получаю эту ошибку из-за соединения слева:

[Предупреждение] Отсутствует аргумент 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() принимает два аргумента. Первая - это таблица для присоединения, а вторая - предложение «включено».

Вы хотите:

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

Вы должны были бы бежать $object надлежащим образом, конечно.


NB: Ваш код выглядит немного хрупким, как вы не гарантируя, что вы на самом деле $object имеет таблицу БД. Я рекомендую вам использовать ClassInfo::baseDataClass($object). Это будет иметь дополнительную выгоду, что он также будет дезинфицировать ваше имя класса и обеспечить его реальный класс.