ORDER BY RAND() in Doctrine without implement a new Doctrine function

Предположим, что нам нужно выбрать N строк из базы данных и отсортировать их случайным образом. При этом у нас нет возможности (или желания) реализовывать функцию rand() в Doctrine. 

В MySQL эта задача решается очень просто:

SELECT column FROM table
ORDER BY RAND()
LIMIT 10

Но если вы используете DQL (Doctrine Query Language) это будет не так просто. Следуя документации вы можете реализовать расширение для Doctrine и добавить инструкцию RAND в запросы, но мы не будем этого делать.

Для нашего решения мы будем использовать конструкцию where IN и будем искать что-нибудь (в данном случае ID или другое поле с автоинкриметом, если ваша таблица не содержит первичного ключа с автоинкриментом, вы должны реализовывать RAND расширение для Doctrine) в соответствии с случайными числами полученными при помощи простой функции на php.

В данном примере, таблица имеет поле с автоинкриментом, которое называется id (которая содержит в себе числовые значения), что бы получить случайные записи нам нужно для начала создать функцию, которая возвращает случайные числа в заданном диапазоне (начальное значение, максимальное значение и количество), например, такую как эта:

function UniqueRandomNumbersWithinRange($min, $max, $quantity) {
$numbers = range($min, $max);
shuffle($numbers);
return array_slice($numbers, 0, $quantity);
}

UniqueRandomNumbersWithinRange выдаст нам числа в заданном диапазоне, эти числа мы будем использовать что бы искать случайные строки в нашей таблице при помощи Doctrine, вот так:

$em = $this->getDoctrine()->getManager();
$repo = $em->getRepository('AppBundle:EntityName');
$quantity = 5;
$totalRowsTable = $repo->createQueryBuilder('a')->select('count(a.id)')->getQuery()->getSingleScalarResult();

$randomIds = UniqueRandomNumbersWithinRange(1,$totalRowsTable,$quantity);

$random_articles = $repo->createQueryBuilder('a')
->where('a.id IN (:ids)') // если у вас другое поле - поменяйте это
->setParameter('ids', $randomIds)
->setMaxResults(3)// Добавьте эту строку если вы хотите получить ограниченное количество записей (Если все IDs существуют вам будет нужно ограничение)
->getQuery()
->getResult();

Эта статья является вольным переводом этой

Включить отдачу .woff .woff2 .svg в IIS

По-умолчанию, в IIS отключен обработчик для файлов шрифтов (например, .woff .woff2) и графики в .svg. Что бы включить нужно сделать следующее:

  1. В Диспетчере служб IIS перейти в «Типы MIME»
  2. Добавить

Значения:

Расширение MIME
.woff application/x-woff
.wof2 application/x-woff2
.svg image/svg+xml

Разбор GET (Query) параметров на Dart

Потребовалось разобрать URL текущей страницы и получить значения GET-параметров по их имени. Набросал функцию:

String _getParameterByName(String name) {
  name.replaceAll('/[\[]/',"\\[").replaceAll('/[\]]/', "\\]");
  RegExp regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
  var results = regex.allMatches(window.location.toString());
  return results.length == 0 ? '' : Uri.decodeComponent(results.last.group(1).replaceAll('/\+/g'," ")) ;

}

Данная функция принимает имя параметра, а возвращает его значение, если он найден, иначе пустую строку.

php,mysql, Reg_exp : http://go.pyatnitsev.ru или удобная навигация

Мне сильно понравилась мысль коротких ссылок на сайтах. Нет, это не сервисы как bit.ly или goo.gl, а страницы переадресации внутри домена. Таковые есть у Microsoft, Intel. Нужны, чтобы их можно было легко запомнить и раздать клиентам, для их же удобства.

Захотелось сделать такую же страничку. Сделал. Дело было так:

Иду и создаю поддомен http://go.pyatnitsev.ru, пока он развертывается, начинаю продумывать структуру базы и php-кода, который этим занимался бы.

Continue reading