【问题标题】:How to join two tables in SilverStripe如何在 SilverStripe 中连接两个表
【发布时间】:2016-01-08 17:11:54
【问题描述】:

我一直在到处搜索,但找不到解决方案。我想加入 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 [lengths] => [num_rows] => 5 [type] => 0 ) [currentRecord:protected ] => [rowNum:protected] => -1 [queryHasBegun:protected] => )

有人知道怎么做吗?谢谢!

【问题讨论】:

  • 第一:这与 jquery 无关,第二:您使用原始查询,您将获得查询对象 - 所以从那里开始:docs.silverstripe.org/en/2.4/reference/sqlquery
  • 抱歉,我把它误认为是“查询”。我试过 SQLQuery(),但它给了我与使用原始查询相同的结果。我正在使用 SS 3.2 顺便说一句。

标签: silverstripe


【解决方案1】:

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

$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);
}

【讨论】:

    【解决方案2】:

    您确实无法通过默认 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 这样的 sn-p。

    【讨论】:

    • 嗨@Terry,我已经尝试过了,但是当我使用Debug::show($items) 时,我只得到了MySQLQuery::__set_state(array( 'handle' => mysqli_result::__set_state(array( 'current_field' => NULL, 'field_count' => NULL, 'lengths' => NULL, 'num_rows' => NULL, 'type' => NULL, )), 'currentRecord' => NULL, 'rowNum' => -1, 'queryHasBegun' => false, ))
    • 我认为你应该像 $result = $items->execute(); 一样运行它Debug::dump($items) 可能会转储 SQL 查询对象而不是执行状态。
    • 似乎使用 DB:Query 您需要使用 $items->value() 获取结果。如果您查看上面的链接,则使用 SQLQuery 认为您应该能够获取连接的字段数据。目前我自己无法测试。
    • 嗨@DimSum,这是正确的。如果您使用 var_dump 或使用 Debug::show 您将获得有关连接和结果的信息。但是您仍然可以使用 foreach() 迭代这些结果。试试这个:foreach($items as $item) { Debug::show($item); }
    猜你喜欢
    • 2020-05-11
    • 2018-11-08
    • 2021-11-20
    • 2018-02-19
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多