如何在 Silverstripe 中将自定义 SQL 查询显示为模板循环?

How to display a custom SQL query as a template loop in Silverstripe?

我正在尝试将以下 SQL 查询显示为 Silverstripe 循环:

public function FilteredCompanyDivisions($SectionID)
{
  $query = DB::query(
    'SELECT "CompanyDivision"."Title", "Office_CompanyDivisions"."DivisionPhoneNumber"
    FROM "CompanyDivision"
    LEFT JOIN "Office_CompanyDivisions" 
      ON "CompanyDivision"."ID" = "Office_CompanyDivisions"."CompanyDivisionID"
    LEFT JOIN "Section_SectionCompanyDivisions" 
      ON "Section_SectionCompanyDivisions"."CompanyDivisionID" = "CompanyDivision"."ID"
    WHERE "Section_SectionCompanyDivisions"."SectionID" = '.$SectionID.'
      AND "Office_CompanyDivisions"."OfficeID" = '.$this->ID);

运行它通过下面的代码returns一个数据对象:

$output = array();
if ($query) {
    foreach ($query as $item) {
        $output[] = array(
            'Title' => $item['Title'],
            'DivisionPhoneNumber' => $item['DivisionPhoneNumber']
        );
    }
}

    return $output;
}

通过 Debug::show($output); 返回的数据对象如下所示:

0 =
    Title =
    Widget Fluffing
    DivisionPhoneNumber =
    06 666 6666

但以下模板代码不起作用:

<% loop FilteredCompanyDivisions($Top.ID) %>
  <li>
    <i class="icon-phone"></i> 
    <a href="tel:$DivisionPhoneNumber">$DivisionPhoneNumber</a> - $Title
  </li>
<% end_loop %>

...和 ​​returns 这个 HTML:

<li><i class="icon-phone"></i> <a href="tel:"></a> - </li>

我做错了什么以及如何在 Silverstripe 中显示自定义 SQL 作为模板循环?

您需要使用 ArrayListArrayData 而不是返回 php 数组。

$output = ArrayList::create();
if ($query) {
    foreach ($query as $item) {
        $output->push( ArrayData::create(array(
            'Title' => $item['Title'],
            'DivisionPhoneNumber' => $item['DivisionPhoneNumber']
        )));
    }

    return $output;
}