使用SilverStripe的SQLQuery对象而不选择*字段

时间:2015-10-05 08:01:00

标签: orm silverstripe

查看at the documentation,有关于如何构建SQL查询的相当好的说明。

我的代码如下所示:

$sqlQuery = new SQLQuery();
$sqlQuery->setFrom('PropertyPage')->selectField('PropertyType')->setDistinct(true);

我的目标是获得以下SQL:

SELECT DISTINCT PropertyType FROM PropertyPage

但是我回来了:

SELECT DISTINCT *, PropertyType FROM PropertyPage

即使他们自己的例子似乎也回馈了'SELECT DISTINCT *。我怎么能避免这个?

2 个答案:

答案 0 :(得分:3)

为什么直接使用SQLQuery?

使用纯ORM,它应该是这样的:

$result = PropertyPage::get()->setQueriedColumns(array('PropertyType'))->distinct();

返回一个可以循环的DataList。

请参阅setQueriedColumns()distinct()

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

答案 1 :(得分:3)

只是为了添加@ wmk的答案以及直接解决如何使用SQLQuery进行操作,您对selectField的调用就是该查询发生的原因。 documentation to selectField表示它添加了一个要选择的附加字段,而不是将列表限制为该字段。

他们的示例(AB)也有问题的原因是the first parameter for the constructor for SQLQuery is a default value of "*" for select statement

要仍以您的代码为基础,请将selectField替换为setSelect。您的查询将如下所示:

SELECT DISTINCT PropertyType FROM PropertyPage

使用SQLQuery直接查询数据库并不坏,特别是如果您真的只想要特定列的原始数据或结果本身不能用DataObject表示(例如,使用列别名)。您还可以获得较小的性能改进,PHP无需实例化DataObject

虽然这样说,但是DataObject以及它为每条记录公开的各种功能会更有用。