Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.04.2017 19:04:22

Реализация фильтров для товара через отношения

Здравствуйте. Проблема в реализации фильтров для товара.
Имеются такие таблицы(Возможное вы меня поправите)

Тест BBcode
В таблице filters могут быть поля цвет с id=1, размер  с id=2 и т.д.
В таблице attributes получается сам атрибут например Красный значит filter_id = 1 и т.д.
В таблице attribute_good уже сами атрибуты для каждого товара

Сам вопрос. Как мне группировать аттрибуты в фильтр?
Вот я себе представляю это так http://jsoneditoronline.org/?id=248ea31 … 794213b0e5

Но сейчас я реализовал это, но есть баг. Выводят атрибуты товара а в них уже как в отношениях выводиться таблица с фильтром. Т.е.
У меня 3 цвета и 2 размера значит будет три раза повторятся фильтр цвет и 2 раза фильтр размер. Т.е. у меня сейчас вот так
http://jsoneditoronline.org/?id=46062b2 … 60351e095c

Как думаете можно ли это реализовать через отношения в Ларе? Или лучше написать через билдер?

Не в сети

#2 05.04.2017 20:35:19

Re: Реализация фильтров для товара через отношения

В ларавел можно реализовать.

Нужно создать модель для таблицы Attributes и модель для Filters

в Attributes прописать отношение

    public function filter()
    {
        return $this->hasOne('App\Models\Filter');
    }

В запросе из БД должен присутствовать метод ->with('filter')

тоесть примерно так:

$result = Attribute::where('id', '=', 1)->with('filter')->first();

Изменено Illia (05.04.2017 20:36:50)

Не в сети

#3 05.04.2017 22:29:50

Re: Реализация фильтров для товара через отношения

Illia пишет:

В ларавел можно реализовать.

Нужно создать модель для таблицы Attributes и модель для Filters

в Attributes прописать отношение

    public function filter()
    {
        return $this->hasOne('App\Models\Filter');
    }

В запросе из БД должен присутствовать метод ->with('filter')

тоесть примерно так:

$result = Attribute::where('id', '=', 1)->with('filter')->first();

У меня это есть. Я же прислал ссылочку на json как есть и как нужно что бы было
У меня сейчас реализовано как Goods::with('Attributes.Filters')->find(1); к примеру. И выходит вот так, как показнно по ссылочку json

Не в сети

#4 05.04.2017 22:46:41

Re: Реализация фильтров для товара через отношения

Я понимаю вашу логику, построения БД, но смею предположить, что она не верна, ибо нельзя мешать в кучу цвета и размеры. Одна таблица - это одна сущность, и размеры, должны быть в отдельной таблице, а цвета в отдельной. В идеале я бы еще и отделил в отдельную таблицу единицы измерения размеров (см, дюймы и прочие). То есть чтобы в таблице размеров было только число, и создать промежуточную таблицу размеров и единиц измерений.

Если Вы хотите подогнать ответ под этот, тогда нужно чтобы запрос был

Goods::with('Filters.Colors', Filters.Sizes')->find(1);

То есть у Вас должна модель фильтров иметь отношение один ко многим цветам и один ко многим размерам. А модель Goods должна иметь отношение - many to many к фильтрам. Ибо один товар может иметь несколько фильтров, и один фильтр, может относится к нескольким товарам.

Отсюда вытекает, что нужно:
- переименовать связующую таблицу attribute_good на filter_good;
- создать таблицу размеров sizes и ее модель;
- создать таблицу размеров colors и ее модель;

И будет вам такой ответ как в джсоне.

Изменено Illia (05.04.2017 22:50:19)

Не в сети

#5 06.04.2017 16:40:00

Re: Реализация фильтров для товара через отношения

Illia пишет:

Я понимаю вашу логику, построения БД, но смею предположить, что она не верна, ибо нельзя мешать в кучу цвета и размеры. Одна таблица - это одна сущность, и размеры, должны быть в отдельной таблице, а цвета в отдельной. В идеале я бы еще и отделил в отдельную таблицу единицы измерения размеров (см, дюймы и прочие). То есть чтобы в таблице размеров было только число, и создать промежуточную таблицу размеров и единиц измерений.

Если Вы хотите подогнать ответ под этот, тогда нужно чтобы запрос был

Goods::with('Filters.Colors', Filters.Sizes')->find(1);

То есть у Вас должна модель фильтров иметь отношение один ко многим цветам и один ко многим размерам. А модель Goods должна иметь отношение - many to many к фильтрам. Ибо один товар может иметь несколько фильтров, и один фильтр, может относится к нескольким товарам.

Отсюда вытекает, что нужно:
- переименовать связующую таблицу attribute_good на filter_good;
- создать таблицу размеров sizes и ее модель;
- создать таблицу размеров colors и ее модель;

И будет вам такой ответ как в джсоне.


А если нужно будет добавить новый фильтр в админке например, придется делать новую модель? Очень муторно. Не знаете, а нельзя перебрать коллекцию вот ту, что я кидал в виде json в коллекцию которая мне нужна типа цвета: крассный, белый размер:20см 30см?

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

Не в сети

Подвал раздела