Произвольно выбирайте записи, используя QueryBuilder от extbase - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над сделанным на заказ расширением в TYPO3 версии 8.

В моем расширении я хочу отображать три элемента во внешнем интерфейсе в случайном порядке из набора результатов, по крайней мере, десяти или около того..

В качестве примера (выберите случайным образом только трех человек и передайте их представлению)

Сначала я взглянул на QueryBuilder и создал собственный запрос.Глядя на другие подобные посты, может показаться, что в построителе запросов extbase отсутствует функция RAND (по уважительной причине).

Было бы лучше взглянуть на использование Fluid и viewhelper итератора, чтобы помочь мне показать элементы вслучайный порядок?Или это может быть достигнуто с помощью QueryBuilder?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Запрос хранилища Extbase не имеет каких-либо случайных функций.По крайней мере, новый Doctrine Querybuilder, поскольку TYPO3 8 LTS можно использовать для получения случайных результатов: https://docs.typo3.org/typo3cms/CoreApiReference/latest/ApiOverview/Database/QueryBuilder/Index.html

В этом QueryBuilder вы можете использовать addSelectLiteral для вставки функции RAND () в запрос к БД.Но вы должны убедиться, что ваше программное обеспечение базы данных поддерживает эту функцию , поскольку БД TYPO3 может быть подключена к любому другому программному обеспечению БД, которое, возможно, не поддерживает RAND ().

Пример использования:

$rows = $queryBuilder
        ->select('*')
        ->from('tx_yourext_domain_model_example')
        ->addSelectLiteral('RAND() AS randomnumber')
        ->orderBy('randomnumber')
        ->setMaxResults(3)
        ->execute()
        ->fetchAll();

Для создания некоторых записей моделей Extbase из результата вы можете использовать DataMapper.

$dataMapper = GeneralUtility::makeInstance(TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper::class);
$result = $dataMapper->map(\You\Yourext\Model\Example::class, $rows);
0 голосов
/ 22 марта 2019

Я не использую VHS в TYPO3v9.Я использую секунды и простую математику, чтобы получить 1 случайный элемент.Например, я получаю случайное значение итератора из массива {news} через:

<f:variable name="sec4random" value="{f:format.date(date:'0 seconds', format:'s')}"/>
<f:variable name="count4random" value="{f:count(subject: news)}"/>
Random index for iterator: {sec4random % count4random} 
0 голосов
/ 12 февраля 2019

Я не думаю, что в TYPO3, Fluid или QueryBuilder есть какая-то сборка для этого.То, как я это решу, зависит от общего количества записей.

Если бы это было всего несколько десятков, я бы, вероятно, выбрал их все и использовал бы функцию PHP shuffle, чтобы отсортировать их случайным образом, а затем показатьпервые 3.

Если может быть сотни и более записей, я бы, вероятно, сделал подсчет и получил бы 3 случайных числа между 0 и результатом подсчета.Затем вы можете выполнить 3 разных запроса, используя функции setFirstResult (случайное число) и setMaxResults (1).

...