У меня есть список объектов данных, из которых я пытаюсь вернуть все объекты, соответствующие определенным годам, например все объекты, соответствующие 2015, 2013, 2002 и т. Д.

Сначала я попытался использовать ExactMatchMulti в соответствии с вопросом здесь: Silverstripe - фильтрация списка DataObject по многим отношениям

Однако теперь это устарело, и Silverstripe предлагает использовать вместо него ExactMatchFilter. Однако я не могу найти много документации / кода использования ExactMatchFilter, поэтому я не уверен, как его использовать. Замена ExactMatchMulti на ExactMatchFilter вызывает исключение.

$things->filter('PublicationDate:ExactMatchFilter', $filters);

Где $filters - это простой массив лет.

Есть ли у кого-нибудь примеры или предложения по этому поводу?

(Используя 3.2.1)

2
Chris Turner 30 Дек 2015 в 01:58

3 ответа

Лучший ответ

На самом деле было очень просто и просто по недосмотру. Рабочий пример:

public function getPagesByFilter() {
    $filters = array('2015', '2014');
    Page::get()->filterAny('PublicationDate:PartialMatch', $filters);
}

Как упоминалось выше, самым простым и очевидным было использование filterAny, а не только filter. Это вернет все страницы с датами публикации в 2015 и 2014 годах.

0
Chris Turner 30 Дек 2015 в 21:08

К вопросу следует добавить подробности исключения.

Я думаю, что использование фильтра точного соответствия в поле даты не будет работать логически, как вы думаете. Точно ли это поле содержит 2015, или оно содержит метку даты и времени? Я предполагаю, что последнее, так как ваше имя поля - PublicationDate.

Это тот, который мы использовали для фильтрации по годам:

NewsItem()->get()->filter('Date:StartsWith', $year)

Или вы можете просто отфильтровать наборы больше и меньше, чем также по годам.

РЕДАКТИРОВАТЬ:

Образец запроса не тестировался на 3.2.1, но должен быть действительным.

Используя любой фильтр, вы можете получить несколько значений с помощью ИЛИ (на основе https: / /docs.silverstripe.org/en/3.2/developer_guides/model/data_model_and_orm/#filterany):

 NewsItem()->get()->filterAny("Date:StartsWith",array('2015','2014'));

Затем сгенерируйте массив с нужными годами, как вы хотите.

Чаевые:

Используйте - & gt; sql (), чтобы узнать, что такое запрос sql: Debug::dump(NewsItem()->get()->filterAny("Date:StartsWith",array('2014','2015'))->sql());

РЕДАКТИРОВАТЬ: исправлено, чтобы исправить проблему с двойным ключом.

1
Olli Tyynelä 1 Сен 2016 в 09:48

В DataList формулировку «Фильтр» не следует использовать в функции filter ().

Правильный синтаксис должен быть

$things->filter('PublicationDate:ExactMatch', $filters);

Посмотрел https: // github .com / silverstripe / silverstripe-framework / blob / 3.2.1 / search / filters / ExactMatchFilter.php # L51.

Передача array () в ExactMatchFilter должна соответствовать вашим требованиям.

0
Jasonz 30 Дек 2015 в 11:39