使用Silverstripe ORM在单个列上选择DISTINCT

时间:2016-09-05 23:59:32

标签: silverstripe

我的表:

-----------------------------------------
| ID | RoomTypeId | ChargeTypeId | Name |
-----------------------------------------
|  1 |    23      |    32        |  DD  |
|  2 |    26      |    32        |  DD  |
|  3 |    28      |    31        |  CC  |
-----------------------------------------

默认情况下,ORM已经是DISTINCT,但是对每一列都这样做并返回所有3

我需要的回报:

-----------------------
| ChargeTypeId | Name |
-----------------------
|      32      |  DD  |
|      31      |  CC  |
-----------------------

希望实际上有一种实现方法,而不必DB::query()

1 个答案:

答案 0 :(得分:2)

我发现toMap()会根据您选择的列

创建一个DISTINCT查询

示例

$result = \ChargeTypes::get()->toMap("ChargeTypeId", "Name")

<强> $ result-&GT;指定者()

array(2) {
    [32]=>
  string(2) "DD"
    [6]=>
  string(2) "CC"
}

UPDATE 我不相信这实际上会创建一个DISTINCT查询,它只是在我的案例中工作,以下将清楚阐述为什么

$myArray = array();
$myArray[32] = "DD";
$myArray[32] = "DD";
$myArray[32] = "DD";
$myArray[6] = "CC";
$myArray[6] = "CC";
var_dump($myArray);

结果:

array(2) {
    [32]=>
  string(2) "DD"
    [6]=>
  string(2) "CC"
}

所以理论上只要你的第一个密钥是唯一的,尽管有多余的迭代,这实际上并不是解决方案的好处。