Как получить все связанные модели в отношениях «многие ко многим» laravel?

8. Ресурсы

Работать по принципу REST в Laravel очень просто. Чтобы зарегистрировать контроллер с ресурсами, нужно просто вызвать следующим образом:

С помощью этого кода Laravel зарегистрирует 8 маршрутов.

  • GET /orders
  • GET /orders/:order
  • GET /orders/create
  • GET /orders/:order/edit
  • POST /orders
  • PUT /orders/:order
  • PATCH /orders/:order
  • DELETE /orders/:order

Затем соответствующий контроллер можно будет сгенерировать следующей командой из командной строки:

В этом новом сгенерированном контроллере каждый метод будет соответствовать каждому маршруту, которые мы сделали выше. Например маршрут будет соответствовать методу , — методу и т.д.

Теперь у нас есть мощные возможности, которые позволяют с легкостью создавать RESTful приложения и API.

Кто и зачем использует Laravel

Laravel пользуются backend-разработчики, которые пишут код на PHP. Он помогает определить структуру веб-приложения и служит для нее каркасом. Фреймворк написан на PHP и расширяет его возможности. Распространяется бесплатно под лицензией MIT.

Назначение Laravel — создание веб-приложений и сайтов на основе MVC (model-view-controller). Это вариант архитектуры, при котором компоненты программы делятся на три части:

  • модель (model) предоставляет данные и методы работы с ними: запросы в базу данных, проверка на корректность;
  • представление (view) показывает пользователю эти данные и изменяется, если меняется модель;
  • контроллер (controller) направляет данные от пользователя к системе и наоборот.

Когда пользователь работает с приложением, построенным по схеме MVC, он взаимодействует с представлением и контроллером. Представление — это то, что он видит, например сведения, которые отображены в визуальном интерфейсе. А контроллеру пользователь отдает команды.

Например, нажатие на кнопку в приложении будет обращением к контроллеру. Тот видоизменит модель. Потом обновится представление: оно получит из модели новые данные и изменит состояние. Так пользователь увидит результат нажатия на кнопку.

Наглядно взаимодействие представлено на схеме.


Архитектура MVC

Архитектура MVC позволяет писать более читабельный код, а процесс разработки сделать комфортным, разграничивая работу frontend- и backend-разработчиков.

Почему не Symfony и Yii?

Symfony все таки рассчитан на большие проекты, мелкие и средние проекты на нем делать, это как экскаватором картошку выкапывать :). Можно, но не сильно удобно, а нам нужен был фреймфорк на все случаи.

Yii хороший фреймворк и разработчики, которые имеют достаточный опыт с ним скажут что он лучше чем Laravel. Тоже самое только в обратную сторону скажут ларавельщики.

Но на тот момент у нас не было опыта ни в Yii, ни в Laravel, поэтому открыв документацию на Laravel и Yii, и потратив день на ее изучение мы поняли, что философия Laravel нам ближе. Вырезка из документации.

«Laravel – фреймворк для построения веб-приложений с выразительным и элегантным синтаксисом. Мы считаем, что процесс разработки только тогда наиболее продуктивен, когда работа с фреймворком приносит радость и удовольствие. Счастливые разработчики пишут лучший код.»

19. Команды

Как было подмечено ранее, есть несколько сценариев, когда может понадобиться написать свои собственные команды. Они могут использоваться для генерации файлов, развертывания приложений и прочего.

Так как это довольно распространенная задача, то Laravel максимально упрощает процесс создания собственных команд.

Эта команда создаст весь необходимый код, готовый для написания своей собственной команды. Затем в новой созданной команде p заполняем имя команды и ее описание:

И наконец в методе выполняем любые действия, которые нам нужны. Как только будет готово, останется только зарегистрировать новую команду в Artisan, в файле .

Верите или нет, но это все! Теперь можно вызывать вашу собственную команду из терминала.

теория множеств

Laravel обеспечивает поддержку теории множеств, что означает, что мы можем выполнять операции пересечения, объединения и другие операции для двух разных множеств.

союз

добавляет данный массив в коллекцию. Если данный массив содержит тот же ключ, что и исходный набор, значение исходного набора не будет изменено:

    /**
     * add array values to a collection using union
     */
    public function union()
    {
        $coolPeople = collect();

        $allCoolPeople = $coolPeople->union();
        $allCoolPeople->all();
        /*
        
       */
    }

пересекаться

Метод intersect () получает массив или коллекцию в качестве параметра, который удаляет элементы коллекции, не включенные во входящий параметр.

    /**
     * Return a list of very cool people in collection that
     * are in the given array
     */
    public function intersect()
    {
        $coolPeople = collect();

        $veryCoolPeople = $coolPeople->intersect();
        $veryCoolPeople->toArray();
        //
    }

Можно обнаружить, что возвращаемое значение метода intersect сохраняет исходный ключ.

Должен ли репозиторий создавать сущности?

Вы могли делать что-то вроде этого:

1
2
3

<?php

$member=$memberRepository->create($email,$password);

Я видел людей которые приводили аргументы для этого подхода. Но я крайне не рекомендую его.

Ещё раз, репозитории это коллекции. Я не уверен что коллекция должна быть ещё и фабрикой. Я слышал аргументы типа.. они хранят состояние, почему же не хранить ещё и создание сущностей?

В моём разуме это анти-паттерн. Почему не разрешить иметь свои собственные представления о своём создании, или почему не иметь фабрику которая специально разработана для обеспечения создания более комплексных объектов.

Если мы используем наши репозитории как простые коллекции, тогда мы даём им одну ответственность. Я не хочу классы коллекции которые так же являются фабриками.

Тестируемость с паттерном репозиторий

Угадайте что? Это очень вкусно. Допустим у вас есть объект, который содержит что-либо похожее на регистрацию участников:

DelphiWebScript/DWS

<?php

class RegisterMemberHandler {
private $members;

public function __construct(MemberRepository $members) {
$this->members = $members;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14

<?php

classRegisterMemberHandler{

    private $members;
 
    public function __construct(MemberRepository $members) {
        $this->members = $members;
    }
 

publicfunctionhandle(RegisterMember$command){

        $member = Member::register($command->email, $command->password);
        $this->members->save($member);
    }
}

В ходе обычных операций вы можете сделать инъекцию реализации —. Тем не менее в ходе тестирования вы можете заменить её на. Обе они реализуют интерфейс

Упрощённая версия теста может быть такой..

1
2
3
4
5
6
7
8
9
10

<?php

$repo=newArrayMemberRepository;

$handler=newRegisterMemberHandler($repo);

$request=$this->createRequest(’email’=>»,’password’=>’angelofdestruction’);

$handler->handle(RegisterMemberusingForm($request));

AssertCount(1,$repo->findByEmail(»));

В этом примере мы тестируем обработчик. Нам не нужно тестировать то что репозиторий хранит данные в базе или где-то ещё. Нам нужно протестировать поведение этого объекта, который должен запросить у класса нового участника на основе аргументов команды, затем положить его в репозиторий.

Группировка моделей в фабрике

Мы также можем сгруппировать различные типы моделей. Например, у нас будут записи с длинным текстом и коротким. Для этого можно воспользоваться методом :

DelphiWebScript/DWS

$factory->defineAs(App\Post::class, ‘short-post’, function ($faker) {
return ;
});

$factory->defineAs(App\Post::class, ‘long-post’, function ($faker) {
return ;
});

1
2
3
4
5
6
7
8
9
10
11
12
13

$factory->defineAs(App\Postclass,’short-post’,function($faker){

    return ;

});

$factory->defineAs(App\Postclass,’long-post’,function($faker){

    return ;

});

Или вы можете расширить базовый тип изменённым:

DelphiWebScript/DWS

$factory->define(App\Post::class, function ($faker) {
return ;
});

$factory->defineAs(App\Post::class, ‘long-post’, function ($faker) use ($factory) {
$post = $factory->raw(‘App\Post’);

return array_merge($post, );
});

1
2
3
4
5
6
7
8
9
10
11
12

$factory->define(App\Postclass,function($faker){

    return ;

});

$factory->defineAs(App\Postclass,’long-post’,function($faker)use($factory){

    $post = $factory->raw(‘App\Post’);
 
    return array_merge($post, );

});

avg()

Метод возвращает среднее значение всех элементов. Если ваша коллекция состоит из примитивов — чисел, то метод можно вызвать без аргумента. Или же, если вы считаете среднее значение элементов массива, то нужно указать ключ, по которому будет считаться среднее значение. Так же, аналогичный метод, который является псевдонимом для является , можете использовать его.

Если выполнить код выше, то результат будет 60, который считается на основе сумы всех значений , и считает их средне-арифметическое значение. Второй вариант использования этого метода — не передавать аргумент вовсе. Этот способ применим к коллекции, состоящей только их цифровых значений:

Выполнив этот код будет возвращено значение , которое является средним значением всех элементов.

Почему же Laravel?

Начиная с 2013 года Laravel признан лучшим и самым популярным фреймфорком в мире. 

  • Синтаксис легче и элегантнее чем у конкурентов.
  • Taylor Otwell (создатель Laravel), дай Бог ему здоровья за его разработку, взял лучшее из существующих PHP фреймфорков, а также Ruby on Rails, ASP.NET MVC, Sinatra и создал фреймворк, который максимально просто решает рутиные задачи программистов.
  •  Laravel – это full stack решение, как для back-end так и для front-end разработчиков. Для фронтенда есть из коробки система сборки laravel Mix, которая построена на Webpack, а так же js фреймворк – Vue.
  • Пакеты (расширения), что дало нам возможность создавать пакеты для своих потребностей. Сейчас у нас около 15 пакетов, которые решают типичные задачи. Та же CMS у нас в виде пакета, которую можно одной командой обновить в случае выхода новых обновлений. Также существуют сотни, а может и тысячи,  готовых пакетов разработчиков всего мира, поэтому нам уже не нужно изобретать велосипед каждый раз, когда приходит нестандартная задача. С большой долей вероятности пакет уже кто-то написал.
  • Наличие интегрированной системы модульного тестирования phpunit,  что делает наши сайты более надежными.
  • Безопасность. Возможность получить несанкционированный доступ к базе данных крайне сложно. Высокий уровень безопасности гарантирует надежную защиту от SQL- injection, атак типа XSS, CSRF.
  • Всегда в тренде. Использует новейшие возможности PHP (функции замыкания, пространства имен и др.), что гарантирует лучшую производительность. В версии 5.5 по умолчанию уже PHP7.
  • Eloquent ORM. Очень простая и функциональя ORM основанная на паттерне ActiveRecord.
  • Большое сообщество. Решение любой проблемы можно легко найти в гугле.

Масштабирование моделей

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

Другие обязанности должны быть перенесены на другие классы. Один из примеров – query scopes: мы могли бы легко переместить их в выделенные классы построителя запросов.

Хотите верьте, хотите нет: классы построителя запросов на самом деле являются обычным способом использования Eloquent; scope – это просто синтаксический сахар поверх них. Именно так может выглядеть класс построителя запросов.

Далее мы переопределяем  в нашей модели и возвращаем наш пользовательский класс. Отныне им будет пользоваться Laravel.

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

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

Вот пример пользовательского класса коллекции, и обратите внимание, что вполне возможно объединить несколько методов в новые, избегая длинных цепочек функций в других местах. Именно так вы связываете класс коллекции с моделью в данном случае:

Именно так вы связываете класс коллекции с моделью в данном случае:

Каждая модель, имеющая  отношение к , теперь будет использовать наш класс коллекции вместо этого.

Старайтесь, чтобы ваши модели были чистыми и ориентированными на данные, а не предоставляли бизнес-логику. Есть места получше, чтобы справиться с этим.

23. Окружения

В то время как для маленьких проектов вполне сгодится и одно окружения, для приложений более серьезных размеров потребуется уже несколько разных окружений. Development, testing, production… все они являются необходимыми и требует свою отдельную конфигурацию.

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

К счастью Laravel упрощает для нас и эту задачу. Взглянем на файл в нашем приложении.

Это базовая демонстрация установки как так и окружений на основе адресной строки в браузере.

Хотя это и работает, но честно говоря, предпочтительнее использовать для таких вещей переменные окружения. Не беспокойтесь; Это все тоже выполнимо в Laravel! Вместо этого просто возвращаем функцию из метода в объекте контейнера.

Теперь если не была установлена переменная окружения (что вы должны будете делать для production), окружение по умолчанию .

Получение моделей

Мотоды get и all возвращают результат в массиве (экземпляр: Illuminate\Database\Eloquent\Collection):

Получение из таблицы все записи через модель:

Добавление дополнительных ограничений

Все методы, доступные в конструкторе запросов, также доступны при работе с моделями Eloquent.

Разделение результата на блоки при большом количестве возввращаемых данных

В данном примере в метод chunk передается по сколько строк получать и функция для обработки.

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

Метод cursor позволяет проходить по записям базы данных, используя курсор, который выполняет только один запрос. При обработке больших объёмов данных метод cursor может значительно уменьшить расходование памяти:

Получение одиночных моделей / агрегатных функций

Получить конкретные записи с помощью find или first. Вместо коллекции моделей эти методы возвращают один экземпляр модели:

Вызвать метод find с массивом первичных ключей, который вернёт коллекцию подходящих записей:

Исключения «Не найдено»

Иногда нужно получить исключение, если определённая модель не была найдена. Это удобно в роутах и контроллерах. Методы findOrFail и firstOrFail получают первый результат запроса. А если результатов не найдено, выбрасывается исключение Illuminate\Database\Eloquent\ModelNotFoundException:

Если исключение не найдено, автоматически указывается заголовок HTTP 404:

count, sum, max и другие агрегатные методы, предоставляемые конструктором запросов count, sum, max и другие агрегатные методы, предоставляемые конструктором запросов

Возможности фреймворка Laravel

Консоль Artisan

Artisan — интерфейс командной строки, включенный в Lavarel. Он позволяет генерировать модели, новые тесты, контроллеры, уведомления из командной строки. Это намного удобнее, чем копировать откуда-либо шаблон класса или писать его вручную. Чтобы посмотреть команды, вы можете воспользоваться командой list:

Консоль используют для работы с базами данных, управления контроллером и других действий. Разработчик может написать для нее собственные команды.

Eloquent ORM

ORM — это технология программирования для связи базы данных и языка программирования. Использование ORM позволяет ускорить разработку. Для PHP существует множество реализаций ORM, но Laravel пользуется собственной. Она называется Eloquent и работает по схеме ActiveRecord, согласно которой каждой таблице в базе соответствует один класс. Eloquent любят за удобство и возможность писать понятный код, который легко поддерживать, защиту от SQL-инъекций — способа взлома сайтов и программ. ORM можно загрузить отдельно от остальных компонентов Laravel.

Конструктор Fluent

Это конструктор для быстрого построения запросов к базе, который полностью совместим с ядром Eloquent ORM. Fluent — мощный инструмент, позволяющий с легкостью модифицировать записи в базе данных. Все запросы используют подготовленные выражения и защищены от SQL-инъекций.

Шаблонизатор Blade

Шаблонизаторы используются для превращения HTML-шаблонов в готовые страницы. Шаблоны — это заготовки для будущих веб-страниц, которые включают HTML-верстку без контента и PHP-код. Задача программы-шаблонизатора — выполнить PHP-код и подставить в шаблон контент, чтобы превратить его в готовую страницу. PHP в итоговой веб-странице быть не должно.

Blade — это шаблонизатор фреймворка Laravel. Он не имеет ограничений на чистый PHP в шаблонах — это удобнее для backend-разработчика. Отсутствие ограничений не создает дополнительной нагрузки на приложение.

Валидация

Валидация — проверка входящих данных. Она нужна, чтобы случайная ошибка была вовремя найдена и обработана. Логику валидации можно написать самостоятельно. Если пользователь введет неверные данные, он попадет на предыдущую страницу. Сайт не «упадет» и останется работоспособным.

Система контроля версий баз данных

Это позволяет проводить миграции — модификации структуры базы данных. С помощью фреймворка можно гибко управлять миграцией прямо через Artisan: запускать, откатывать по отдельности или полностью, видоизменять.

Юнит-тестирование

Его еще называют модульным тестированием. Это «базовый уровень» проведения тестов. На работоспособность тестируются отдельные модули кода. Это нужно, чтобы позже не столкнуться с ошибкой на более высоких уровнях.


Этапы тестирования

В Laravel по умолчанию встроена система PHPUnit — инструмент, который позволяет создавать и проводить тесты. С PHPUnit это проще, чем вручную.

Аутентификация

С Laravel можно реализовать вход на сайт с помощью логина и пароля либо через социальные сети.

Например, пакеты Laravel Passport и Laravel Socialite позволяют входить через API других приложений с помощью стандарта OAuth. Это протокол авторизации, который дает возможность авторизоваться с помощью учетной записи другого сайта, чаще всего соцсети.

Пакет Laravel Sanctum отвечает за аутентификацию для простых приложений и одностраничных сайтов. Он более легковесный, чем Passport, и авторизует пользователя с помощью системы токенов — физических устройств.

filter()

Один из самых популярных и практичных методов. Он фильтрует коллекцию и в новом массиве возвращает элементы, соответствующие заданному условию, при этом оригинальная коллекция остается неизменной. Для указания условий фильтрации callback-функция предусматривает использование ключа и значения.

$users = collect();

$filter = $users->filter(function($value, $key) {
    if ($value == "[email protected]") {
        return true;
    }
});
 
$filter->all();
/*

]
*/

Если вы не используете callback-функцию, данный метод проигнорирует все элементы со значением, эквивалентным false – null, false, “, 0, []. Таким образом, это самый простой способ отбросить все пустые элементы коллекции.

contains()

Метод проверяет, существует ли в текущей коллекции заданное значение. В этом случае, метод возвращает или .

Если вы передадите второй аргумент в метод , он будет проверять существование элемента со значением поля, соответствующим второму аргументу. Другими словами, тогда он проверяет существование пары ключ/значение в коллекции.

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

Калбек принимает два аргумента: текущую итерацию элемента коллекции и ключ этого элемента. Здесь проверяется условие: либо заголовок элемента является , либо длина заголовка равна 15 символам. Вы можете видеть, что комбинировать условия вы можете любым образом.

Заготовки запросов (query scopes)

Глобальные заготовки

Глобальные заготовки позволяют добавить ограничения во все запросы для данной модели. Собственная функция Laravel псевдоудаление использует глобальные заготовки, чтобы получать из базы данных только «неудалённые» модели. Написание собственных глобальных заготовок обеспечивает удобный и простой способ наложить определённые ограничения на каждый запрос для конкретной модели.

Написание глобальных заготовок

Если ваша глобальная заготовка добавляет столбцы для выбора спецификации запроса, следует использовать метод addSelect вместо select. Это предотвратит непреднамеренную замену существующей спецификации выбора запроса.

Применение глобальных заготовок

Для назначения глобальной заготовки (скоупа) на модель надо переопределить метод boot данной модели и использовать метод addGlobalScope:

После добавления заготовки запрос к User::all() будет создавать следующий SQL:

Анонимные глобальные заготовки

Удаление глобальных заготовок

удалить несколько или все глобальные заготовки

Локальные заготовки

Заготовки (скоупы) позволяют повторно использовать логику запросов в моделях. Например, если часто требуется получать пользователей, которые сейчас «популярны». Для создания заготовки просто начните имя метода с префикса scope.

Использование локальной заготовки

Динамические заготовки

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

А затем передают их при вызове метода заготовки:

Создание нескольких объектов

Для создания нескольких объектов достаточно задать количество вторым аргументом:

DelphiWebScript/DWS

$posts = factory(App\Post::class, 3)->make();

1 $posts=factory(App\Postclass,3)->make();

Готово. Теперь у вас есть коллекция объектов класса .

DelphiWebScript/DWS

dd($posts->toArray());

/* Возвратит:
array:3
1 => array:2
2 => array:2
]
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

dd($posts->toArray());

 
/*Возвратит

array3

=>array2

«title»=>»My Awesome Post»

«body»=>»The Body»

1=>array2

«title»=>»My Awesome Post»

«body»=>»The Body»

2=>array2

«title»=>»My Awesome Post»

«body»=>»The Body»

*/

Laravel и Yii: популярность среди отраслей

Laravel и Yii — это две PHP-фреймворки для веб-приложений с открытым исходным кодом, которые следуют шаблону разработки модель-представление-контроллер (MVC). И то, и другое значительно облегчает и ускоряет процесс разработки. Хотя у них есть некоторые отличия в подходах к развитию.

Laravel предлагает веб-разработчикам собственную философию разработки, которая предполагает меньшее количество кода и лаконичный выразительный синтаксис. Между тем, эта надежная структура дает разработчикам программного обеспечения большую свободу разработки и позволяет создавать и добавлять самые сложные функции к разрабатываемым решениям.

Многие компании предпочитают использовать Laravel, поскольку они могут создавать веб-приложения любой сложности и с разнообразными функциями. Laravel — ведущий фреймворк в топ-10 тыс. Сайтов, топ-100 тыс. Сайтов, 1 млн. Самых популярных сайтов и во всей сети.

Yii может похвастаться простотой обработки данных и быстрым развитием благодаря множеству готовых к использованию функций. Он широко применяется для создания веб-приложений, требующих минимума бизнес-логики или быстрых стандартизованных решений.

Согласно отчетам Similar Tech, Laravel и Yii используются для создания веб-приложений в следующих отраслях:

заключение

Я пытаюсь скрыть тот факт, что вы можете найти нужный вам метод самостоятельно, но вам еще слишком многому предстоит научиться.

Самое примечательное из всего, что я оставляю следующее

  • Общие математические методы, такие как сумма и среднее значение.
  • Используются подходы к обновлению коллекций, такие как сращивание, добавление, нажатие и всплывающее окно.

Существует еще много способов управления коллекциями документов Laravel и документов Laravel API, и вы хотите их проверить.

Чтобы ознакомиться с учебным кодом, проверьте репозиторий github здесь. Не стесняйтесь вносить свой код.

От: https://learnku.com/laravel/t…

Дополнительные статьи: https://learnku.com/laravel/c…

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: