在不选择 * 字段的情况下使用 SilverStripe 的 SQLQuery 对象

Using SilverStripe's SQLQuery object without selecting * fields

查看 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 *。我怎样才能避免这种情况?

为什么直接使用SQLQuery?

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

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

您可以遍历哪个 returns 数据列表。

参见 setQueriedColumns() and distinct()

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

只是为了添加到@wmk 的答案以及直接解决如何使用 SQLQuery 来解决问题,您对 selectField 的调用是发生该查询的原因。 documentation to selectField 表明它向 select 添加了一个附加字段,而不是将列表限制为该字段。

之所以自己举例(A and B) also had the issue is that 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 和它为每条记录公开的各种函数,它会更有用。