Ответы пользователя по тегу Laravel
  • Как реализовать вывод товаров по категориям и подкатегориям (Laravel 5.4)?

    @jacob1237
    Ваша задача с категориями не относится к контексту Laravel - это задача о хранении деревьев в СУБД.
    Рекомендую ознакомиться вот с этим ответом: https://toster.ru/answer?answer_id=952447#answers_...

    Принадлежность товаров нескольким категориям в реляционных СУБД (если Вы работаете именно с ними) оформляется как связь "многие-ко-многим" (many-to-many).

    Роутинг Вы уже реализовали в своем ответе. {category} {subcategory} {productID} - это параметры роута, которые будут передаваться в контроллер (документация).

    В контроллере просто вытаскиваете эти параметры, фильтруете и подсовываете в SQL запрос. Хотя {category} (как впрочем и subcategory) здесь даже будет лишним. Но для красоты можете и оставить.
    Ответ написан
  • На чём лучше прокачивать архитектурный навык разработки моделей предметной области и принципов DDD вообще?

    @jacob1237
    Как это реализуется на Laravel? Или может мне с такими запросами и не он нужен?

    Никак не реализуется

    Кроме того, установленный ларавель с его фасадами фасадами как то не сильно сдружился с PHPStorm.

    Для этого существует плагин Laravel IDE helper.

    DDD - просто подход к конструированию архитектуры приложения, его можно реализовать с помощью любого фреймворка.
    Другое дело что некоторые фреймворки/библиотеки могут существенно упростить применение такого подхода.

    Чтобы полноценно работать по DDD, Вам необходимо как можно больше абстрагироваться от кода, ответственного за техническую часть (работа с БД и прочее). В этом как раз помогут паттерны Repository, UnitOfWork, DataMapper и т.д.

    Эти шаблоны уже реализованы, например, в ORM Doctrine. В Laravel же по-умолчанию в качестве слоя БД используется ActiveRecord, который применяется преимущественно в целях RAD (rapid application development).

    Если очень хочется Laravel, можете попробовать AnalogueORM. Это DataMapper-надстройка над Eloquent. Все остальное придется реализовывать ручками.

    Поэтому если хотите начать работать полноценно и сразу, берите Doctrine 2 (либо Hibernate для Java, либо SQLAlchemy для Python и т.д.) и что-то в придачу к нему (тот-же Symfony или любой другой веб-фреймворк с инверсией контроля).

    Если же хотите поразбираться каким образом все устроено на техническом уровне, берите AnalogueORM или нечто подобное и пробуйте остальное реализовывать вручную.
    Ответ написан
    2 комментария
  • Дерево категорий Laravel. Как уменьшить количество запросов в БД?

    @jacob1237
    Если используете PostgreSQL, посмотрите в сторону рекурсивных подзапросов.

    Если это не PostgreSQL, то можете попробовать строить дерево из "сырых данных" непосредственно в PHP (как подсказывает Вам ThunderCat ).

    Но вообще лично я бы для начала оценил частоту изменений категорий в каталоге и общее количество категорий (объем данных), и в соответствии с этой информацией выбрал более подходящую модель хранения деревьев в БД.

    Таких основных моделей четыре: Adjacency list, Nested Sets, Materialized Path и Closure Tables (можно рассматривать как развитие Adjacency List) плюс их вариации.

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

    Присутствуют готовые библиотеки и для Laravel:
    Nested Set
    Closure Tables

    Для Adjacency List (вашей текущей реализации), просто сортируйте данные самостоятельно, либо попробуйте этот пакет.
    Ответ написан
    3 комментария
  • Как реализовывать наследование моделей в laravel?

    @jacob1237
    То что Вы пытаетесь реализовать, называется наследованием таблиц (Table Inheritance) - это такой способ эмулировать наследование классов в реляционных СУБД.

    Всего существует несколько известных вариантов решения такой проблемы, например Single Table Inheritance и Class Table Inheritance (это если не учитывать нативную поддержку подобных вещей в некоторых СУБД, например PostgreSQL).

    Полиморфные же связи (которые по-дефолту в Laravel) - это не очень хороший способ реализации, потому что не позволяет поддерживать целостность связей на уровне СУБД. Однако можно использовать и его, если Вам эта целостность не очень важна (ее надо будет поддерживать на уровне приложения).

    К сожалению Eloquent не поддерживает ни Single Table Inheritance, ни Class Table Inheritance (зато их поддерживает Doctrine из Symfony), поэтому придется писать вручную.

    Прежде чем это делать, я бы Вам посоветовал разобраться как Profile относится к User и OrgAdmin.
    Является ли Profile подвидом пользователя (из названия честно говоря не понял), или же это просто набор дополнительных полей, которые можно оформить в виде связей?

    Если и Profile и OrgAdmin - это подвиды (подтипы) пользователей со своим собственным набором полей, то Вам нужно добавить в общую таблицу отдельное поле type (это называется дискриминатор), в котором у Вас будет проставлен тип пользователя. Например 1 для User, 2 для Profile и 3 для OrgAdmin.
    Короче очень похоже на стандартный Polymorphic Relationships из Laravel.

    А потом переопределяете у модели User функции newFromBuilder() или newInstance() в которых Вы укажете какие классы моделей создавать для конкретного type. Вот например статья.

    Дальше для Class Table Inheritance можно в трейт поместить функцию сохранения и родителя и потомка, потому что сохранять их придется вместе (на уровне БД), в зависимости от измененных свойств. Кроме того, нужно будет позаботиться об отображении (mapping) атрибутов родителя на потомков (__set и __get), на случай если вдруг захочется делать вот так (представьте что атрибут name принадлежит родителю - модели User):
    $profile = new Profile();
    $profile->name = 'John Doe';
    $profile->save();


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

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

    Погуглите по указанным ключевым словам (паттернам), может что уже появилось для Laravel.
    Ответ написан
    3 комментария
  • Новый поиск в Laravel 5.3?

    @jacob1237
    Laravel Scout это просто программная абстракция над различными поисковыми движками (в том числе и ElasticSearch). Библиотека просто добавляет некоторые "вкусности" и удобства при работе с моделями Eloquent.

    Чтобы подключить ElasticSearch к Laravel Scout, нужно просто найти под него соответствующий драйвер.
    Все примеры в документации: https://laravel.com/docs/5.3/scout
    Ответ написан
    Комментировать