Как выбрать только необходимые поля в реляции (связи) 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

 

Перевод

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
% .*
_ .