Silverstripe 3.5 - 如何查询特定列并返回数组

时间:2017-10-18 04:24:49

标签: php silverstripe

我正在尝试选择all以从单个表中获取三列,然后将结果简单地用作数组。没有循环的费用。

我使用ORM方法尝试了这个:

src/test/java

这给了我一个完美的阵列。但我看不到只返回我想要的列的方法。它返回所有列。这是一个问题,因为我是json编码这个数组,并且数据包的大小是它需要的3倍。

所以我尝试使用SQLQuery代替:

DataObject::get('City')->sort('Name ASC')->toNestedArray();

现在这允许我选择三个字段,但据我所知,没有方法可以将此查询作为数组返回,如toNestedArray()

搜索高低,但没有任何适合。有任何想法吗?

编辑:应该提到我已经尝试过setQueriedColumns()抱歉。这似乎不是我在这里所做的。

DB::query('SELECT "ID","Name","ParentID" FROM "City"');

输出:

$cities = AspireCity::get()->sort(['Name' =>  'ASC'])->setQueriedColumns(['ID', 'Name']);
Debug::dump($cities->toNestedArray());

2 个答案:

答案 0 :(得分:2)

根据API DocssetQueriedColumns()是您的朋友:

根据您的问题,我假设您要查询的DataObject被称为City,因此我们需要这样才能将所有城市从数据库中删除:

City::get();

返回DataList并在需要时查询数据库。到目前为止,您的数据库并不知道您希望从中获取某些数据的任何内容。因此,让我们对其进行改进,按照" Name" ASC。我更喜欢数组语法,恕我直言,它更容易阅读,如果你需要排序第二行,只需将它添加到数组:

City::get()
    ->sort(['Name' =>  'ASC']);

现在,由于某些原因,您只需要返回一些列。由于我不知道您的City DataObject有哪些数据库字段,我假设您只是想要' Name'和' ZIP':

City::get()
    ->sort(['Name' =>  'ASC'])
    ->setQueriedColumns(['Name', 'ZIP']);

这限制了查询的列,您可以添加toNestedArray()以将数据作为纯复古数组输出。这可能对将数据传递给API很有用,但最好离开对象并在代码中使用City特定的逻辑。

答案 1 :(得分:0)

所以我认为这是一种过度依赖现有SS辅助方法的情况。虽然toNestedArray()非常方便,但我对它的关注主要是基于思考我可以通过使用它来避免循环。实际上,该方法当然是一个循环。所以我的关注真的没有根据。

最重要的目标是在查询时减少数据集。所以解决方案只关注它。

// Inject the default country/city/suburb data as vars so they can be easily filtered.
$location['countries'] = DB::query('SELECT "ID","Description" FROM "Country" ORDER BY "ID" ASC'); 
$location['cities'] = DB::query('SELECT "ID","Name","ParentID" FROM "City" ORDER BY "Name" ASC'); 
$location['suburbs'] = DB::query('SELECT "ID","Name","ParentID" FROM "Suburb" ORDER BY "Name" ASC');

$masterLocationArray = [];
foreach($location as $key => $data) {
    $locationArray = [];
    foreach($data as $item) {
        $locationArray[] = $item;
    }
    $masterLocationArray[$key] = $locationArray;
}

// $masterLocationArray is our filtered, tidy array. Do stuff with it