Orm 使用SilverStripe';s SQLQuery对象而不选择*字段

Orm 使用SilverStripe';s SQLQuery对象而不选择*字段,orm,silverstripe,Orm,Silverstripe,看起来,关于如何构建SQL查询,有相当好的说明 我的代码如下所示: $sqlQuery = new SQLQuery(); $sqlQuery->setFrom('PropertyPage')->selectField('PropertyType')->setDistinct(true); $result = PropertyPage::get()->setQueriedColumns(array('PropertyType'))->distinct(); SE

看起来,关于如何构建SQL查询,有相当好的说明

我的代码如下所示:

$sqlQuery = new SQLQuery();
$sqlQuery->setFrom('PropertyPage')->selectField('PropertyType')->setDistinct(true);
$result = PropertyPage::get()->setQueriedColumns(array('PropertyType'))->distinct();
SELECT DISTINCT PropertyType FROM PropertyPage
我的目标是获得以下SQL:

SELECT DISTINCT PropertyType FROM PropertyPage
但我得到的却是:

SELECT DISTINCT *, PropertyType FROM PropertyPage

即使是他们自己的例子似乎也给出了一个“选择不同的*”。如何避免这种情况?

为什么直接使用SQLQuery

对于纯ORM,它应该是这样的:

$sqlQuery = new SQLQuery();
$sqlQuery->setFrom('PropertyPage')->selectField('PropertyType')->setDistinct(true);
$result = PropertyPage::get()->setQueriedColumns(array('PropertyType'))->distinct();
SELECT DISTINCT PropertyType FROM PropertyPage
它返回一个可以循环的数据列表

看到和


您使用的是什么版本的SS框架?Distinct是在3.1.7 iirc中添加的。

只是为了添加到@wmk的答案中,并直接说明如何使用
SQLQuery
执行此操作,您对
selectField
的调用就是该查询发生的原因。显示它添加了一个要选择的附加字段,而不是将列表仅限于该字段

他们的例子(和)也有问题的原因是

要仍然使用代码作为基础,请将使用
selectField
替换为。您的查询将如下所示:

$sqlQuery = new SQLQuery();
$sqlQuery->setFrom('PropertyPage')->selectField('PropertyType')->setDistinct(true);
$result = PropertyPage::get()->setQueriedColumns(array('PropertyType'))->distinct();
SELECT DISTINCT PropertyType FROM PropertyPage
使用
SQLQuery
直接查询数据库并不坏,特别是如果您真的只需要特定列的原始数据,或者结果本身无法针对
DataObject
(例如,使用列别名)表示时。您还将有一个小的性能改进,PHP不必实例化
DataObject

尽管如此,拥有一个
DataObject
和它在每个记录中公开的各种函数可能更有用