【发布时间】:2017-10-18 04:24:48
【问题描述】:
我正在尝试全选以从单个表中获取三列,然后简单地将结果用作数组。无需花费循环。
我已经尝试过使用 ORM 方法:
DataObject::get('City')->sort('Name ASC')->toNestedArray();
这给了我一个完美的数组。但我看不到只返回我想要的列的方法。它返回所有列。这是一个问题,因为我正在对这个数组进行 json 编码,因此数据包是它所需大小的 3 倍。
所以我改用 SQLQuery 进行了尝试:
DB::query('SELECT "ID","Name","ParentID" FROM "City"');
现在这允许我选择三个字段,但据我所知,没有任何方法可以将此查询作为数组返回,如 toNestedArray()
搜索了高低,但没有合适的。有任何想法吗?
编辑:应该提到我已经尝试过 setQueriedColumns() 抱歉。这似乎不适用于我在这里所做的事情。
$cities = AspireCity::get()->sort(['Name' => 'ASC'])->setQueriedColumns(['ID', 'Name']);
Debug::dump($cities->toNestedArray());
输出:
Array
(
[0] => Array
(
[ClassName] => City
[LastEdited] => 2017-09-26 11:14:16
[Name] => Acacia Bay
[ID] => 70
[RecordClassName] => City
[Created] =>
[ParentID] => 9
)
[1] => Array
(
[ClassName] => City
[LastEdited] => 2017-09-26 11:14:16
[Name] => Ahaura
[ID] => 71
[RecordClassName] => City
[Created] =>
[ParentID] => 9
)
【问题讨论】:
-
谢谢。我确实尝试过,但似乎没有按预期工作。有关详细信息,请参阅我的问题的编辑。也许 toNestedArray() 会忽略它?
-
我很确定在使用 ORM 时,始终会输出数据对象系统字段。这些是 ClassName、LastEdited、ID、Created。
setQueriedColumns然后允许您选择已添加到 DataObject 模型中的字段。如果您只需要字段 ID、名称、ParentID,您将需要使用 sql 查询,就像您在下面的答案中所做的那样。 -
如果 DataObject 不存在,silverstripe 不会延迟加载数据,因此调用 toNestedArray 肯定会触发每次迭代的所有值的加载,但不记得只会调用属于该查询还导致加载其余丢失的 DO 数据。
标签: php silverstripe