在不选择 * 字段的情况下使用 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
和它为每条记录公开的各种函数,它会更有用。
查看 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
和它为每条记录公开的各种函数,它会更有用。