2015-09-03 8 views
2

В SilverStripe, один может принести кучу записей, например, так:SilverStripe 3.1.x - DataList Уникальный фильтр значений полей/Как использовать ORM для подсчета элементов в Групповом списке?

$entryRecords = Entry::get()->sort('Email'); 

Если я хочу, чтобы узнать, сколько запись записей у меня есть, я могу вызвать метод подсчета на DataList, как это:

$totalEntryRecords = $entryRecords->count(); 

Если я хочу, чтобы узнать, сколько уникальных адресов электронной почты в этих записях, используя SilverStripe ORM в PHP с DataList без написания цикла и не прибегая к управлению нового пользовательского запроса DB, как бы я это сделать?

Вот что я пытался до сих пор, и это не работает:

GroupedList::create($entryRecords)->groupBy('Email')->Count(); // does not work 

я получаю фатальную ошибку: PHP Фатальная ошибка: Вызов функции члена Count() на не-объект

API GroupedList показывает, что существует метод Count. Поэтому не уверен, почему это не сработает.

ответ

2

хорошо это работает ...

count(GroupedList::create($entryRecords)->groupBy('Email')); 
1

почему не просто "выбрать distinctemail из ..."?

например.

$uniqueEmailsCount = Entry::get()->distinct()->setQueriedColumns(array('Email'))->count(); 

Я думаю, что это более результативно.

+0

Не знаю о 'setQueriedColumns', это полезно! Да, я бы подумал, что ваш будет быстрее, чем вручную перечислять «GroupedList», так как ваш будет работать в БД и отбрасывать все записи и зацикливаться на PHP. – Turnerj

0

Существует не метод, который называется "отличный" в DataList,

$counter = GroupedList::create(SomeDataObject::get())->GroupedBy('Title')->count(); 

Ваш лучший вариант.

+1

[На самом деле это связано с @wmk в его ответе.] (Http://api.silverstripe.org/3.1/class-DataList.html#_distinct) – Turnerj

+0

@wmk my bad, я искал его на сайте 3.0. Эта функция была введена в 3.1 – cbarberis

 Смежные вопросы

  • Нет связанных вопросов^_^