Как выбрать только необходимые поля в реляции (связи) Laravel

Иногда требуется выбрать не всю таблицу, а только некоторые поля из связи в контроллере. Сделать это можно так:

$user = User::with(['department' => function ($q) {
                $q->select(['id','name']);
            } ])->get();

 

Blade Foreach: первый/последний элемент массива

Шаблоны blade используются для представления данных, нам нужно добавить некоторые проверки и If структуры. Один из примеров это цикл @foreach, когда нужно выполнить какие-либо действия с первым или последним элементом массива.  Blade не поддерживает эту функциональность самостоятельно, итак, что же нам делать?

Под капотом, Blade-файлы в действительности преобразуются в чистый PHP.  Итак, хитрость в том, что мы можем использовать любую функцию из PHP. И с массивами у нас есть две полезных функции что бы получить первый и последний элементы массива:

  • end($array) – перемещает внутренний указатель массива к последнему элементу и возвращает его значение.
  • reset($array) – перемещает внутренний указатель массива к первому элементу и возвращает его значение.

Итак, как это выглядит в настоящем примере с Blade? Предположим, мы хотим скрыть каждый элемент div, кроме первого:

@foreach ($menu as $item)
  <div @if ($item != reset($menu)) class=«hidden» @endif>
    <h2>{{ $item->title }}</h2>
  </div>
@endforeach

Похожий пример — что если мы хотим добавить CSS-класс к последнему элементу меню?

@foreach ($menu as $item)
  <div @if ($item == end($menu)) class=«no_margin» @endif>
    <h2>{{ $item->title }}</h2>
  </div>
@endforeach

Это все. Как вы можете видеть Blade не только шаблонизатор, он обладает мощью структур и функций PHP

 

Перевод

Человекочитаемый размер файла в PHP

Маленькая функция для преобразования размера  в байтах в человекочитаемый вид:

<?php
function human_filesize($bytes, $decimals = 2) {
    $size = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
    $factor = (int) floor((strlen($bytes) - 1) / 3);
    return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$size[$factor];
}

Использование

<?php
echo human_filesize(filesize('example.zip'));

Источник

Миграция пользователей на безопасный алгоритм хеширования в Symfony

Ваше приложение может использовать старый, небезопасный алгоритм хеширования для хранения пароля, такой как MD5 (без использования соли)

Эта статья объясняет как преобразовать уже имеющиеся пароли, зашифрованные уязвимым алгоритмом в пароли зашифрованные с использованием безопасного метода хеширования (например с использованием Bcrypt )

Что бы решить проблему, мы сделаем конвертацию на лету, когда пользователь успешно входит в систему. Будем использовать интерфейс EncoderAwareInterface

login listener и использовать не очень хорошо известные параметры в security.yml.
Continue reading

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();

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

Laravel: Like для коллекций

В коллекциях Laravel 5.1 нет функции like для коллекций, но можно написать подобное поведение при помощи filter.

 $searchBy = 'gr';
 $data = collect(array('name' => 'gregg', 'name' => 'john', 'name'=> 'alice'));
        $data = $data->filter(function ($item) use ($searchBy) {
            return (bool) preg_match('#^'.preg_quote($searchBy).'.*$#us', $item['name']);
        });
SQL like preg_match
% .*
_ .

 

«405 method not allowed» IIS for Restful methods

По-умолчанию в IIS запрещены методы, которые используется в Restful API, например DELETE, PUT и другие.

Для того, что бы разрешить эти методы нужно:

  1. В диспетчере IIS открыть Сопоставления обработчиков
  2. Найти обработчик PHP, зайти в его настройки
  3. Ограничение запроса…
  4. Команды
  5. Прописать необходимые методы, например: GET,POST,PUT,DELETE, а также можно разрешить все.

Включить отдачу .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

Flat array to nested in php

Requirements = PHP 5.3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function buildTree($flat, $pidKey, $idKey = null)
        {
            $grouped = array();
            foreach ($flat as $sub){
                $grouped[$sub[$pidKey]][] = $sub;
            }
 
            $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey) {
                foreach ($siblings as $k => $sibling) {
                    $id = $sibling[$idKey];
                    if(isset($grouped[$id])) {
                        $sibling['children'] = $fnBuilder($grouped[$id]);
                    }
                    $siblings[$k] = $sibling;
                }
 
                return $siblings;
            };
 
            $tree = $fnBuilder($grouped[0]);
 
            return $tree;
        }
function buildTree($flat, $pidKey, $idKey = null)
        {
            $grouped = array();
            foreach ($flat as $sub){
                $grouped[$sub[$pidKey]][] = $sub;
            }

            $fnBuilder = function($siblings) use (&$fnBuilder, $grouped, $idKey) {
                foreach ($siblings as $k => $sibling) {
                    $id = $sibling[$idKey];
                    if(isset($grouped[$id])) {
                        $sibling['children'] = $fnBuilder($grouped[$id]);
                    }
                    $siblings[$k] = $sibling;
                }

                return $siblings;
            };

            $tree = $fnBuilder($grouped[0]);

            return $tree;
        }

Usage:

1
2
3
4
5
6
7
8
9
$flat = array(
    array('id'=>100, 'parentID'=>0, 'name'=>'a'),
    array('id'=>101, 'parentID'=>100, 'name'=>'a'),
    array('id'=>102, 'parentID'=>101, 'name'=>'a'),
    array('id'=>103, 'parentID'=>101, 'name'=>'a'),
);
 
$tree = buildTree($flat, 'parentID', 'id');
print_r($tree);
$flat = array(
    array('id'=>100, 'parentID'=>0, 'name'=>'a'),
    array('id'=>101, 'parentID'=>100, 'name'=>'a'),
    array('id'=>102, 'parentID'=>101, 'name'=>'a'),
    array('id'=>103, 'parentID'=>101, 'name'=>'a'),
);

$tree = buildTree($flat, 'parentID', 'id');
print_r($tree);

Thanks! http://stackoverflow.com/a/27360654/1886270