我正在尝试选择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());
答案 0 :(得分:2)
根据API Docs,setQueriedColumns()
是您的朋友:
根据您的问题,我假设您要查询的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