如何在SilverStripe中连接两个表

时间:2016-01-08 17:11:54

标签: silverstripe

我一直在寻找各地,无法找到解决方案。我想在SilverStripe中加入两个表。这很简单:

class Module extends DataObject {
    ...
    static $has_one = array(
        'Website' => 'Website'
    );
    ...
}
class Website extends DataObject {
    ...
    static $has_many = array(
        'Modules' => 'Module'
    );
    ...
}

我想加入这两个,并获取一个DataList中的所有属性。 leftJoin()函数无法执行任何操作,并且在其网站中提及

  

传递$ join语句将通过对外表执行的JOIN进一步过滤结果。它不会返回额外连接的数据。

我尝试使用原始查询

DB::query('SELECT * FROM "Module" LEFT JOIN "Website" ON "Website"."ID" = "Module"."WebsiteID"');

但我得到的只是这个

  

MySQLQuery对象([handle:protected] => mysqli_result对象([current_field] => 0 [field_count] => 19 [长度] => [num_rows] => 5 [type] => 0)[currentRecord:protected] => [rowNum:protected] => -1 [queryHasBegun:protected] =>)

任何人都知道如何做到这一点?谢谢!

2 个答案:

答案 0 :(得分:0)

我找到了解决方法。它不是连接两个表的完美解决方案,特别是当有很多属性时,它确实给了我现在想要的东西。

$modules = Module::get();

$list = new ArrayList();

foreach($modules as $module) {
    $website = Website::get()->filter(array(
        'ID' => $module->WebsiteID
    ))->first();

    $array = array("mName" => $module->Name,
                    "mDes" => $module->Description,
                    "wName" => $website->Name);
    $list->push($array);
}

答案 1 :(得分:0)

您确实无法通过默认的ORM获取已连接的数据。但是,如果您选择决定使用DB::Query(),则可以轻松地将它们作为数组提取。 一个例子:

                $items = DB::Query("
                            SELECT 
                               Module.Title,
                               Website.URL
                            FROM Module
                            LEFT JOIN Website ON Website.ID = Module.WebsiteID
                ");
                if($items) {
                    $i = 0;
                    foreach($items as $item) {
                        $moduleTitle = $item['Title'];
                        $websiteURL = $item['URL'];
                    }
                }

此选项比您建议的解决方法更快。如果您需要ArrayList,因为您想在模板中使用数据,请自行构建ArrayList,或使用this之类的代码段。