Laravel по-русски

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

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

#1 18.01.2017 17:46:39

Фильтры для товаров

Здравствуйте! Уже облазил весь инет насчет фильтров для товара.


При добавлении товара в админке, есть чекбоксы с фильтрами. Задача в том, что бы при добавлении товара в таблицу Filters_goods записывались значения фильтра, позиции фильтра и сам товар. У меня сложность со связями в ларавеле. filter и filter_position связаны, как один ко многим, а как связать все три таблицы, что бы при create все создавалось в filter_goods ?
Возможно сами таблицы построены не верно:(

Сразу извиняюсь за формулировку вопроса)
Я понимаю как сделать например обычные теги к товару, но вот с фильтрами беда.

Сам товар создаю так
$goods = Goods::create(Request::all());

Как сделать так же только для Filters_goods?
filters
id    name
1    Цвет
2    Размер

Filters_goods
id    goods_id    filters_id    filter_position_id
1    1                1            2             
2    1                1             2

Filters_position
id    Filters_id    name
1    1             красный
2    1             черный
3    2             10см
4    2             15см

Вот вардамп при выборе фильтров
  'filter_position' =>
    array (size=3)
      0 => string '1' (length=1)
      1 => string '2' (length=1)
      2 => string '4' (length=1)

Изменено fenix1996l (18.01.2017 17:49:30)

Не в сети

#2 18.01.2017 18:40:26

Re: Фильтры для товаров

Нужно конечно смотреть на код, поэтому могу с ответом не угадать
Будьте внимательны с

$goods = Goods::create(Request::all());

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

А почему бы вам не добавить ещё один запрос для записи в другие таблицы, раз это админка, значит нагрузка будет не высокой, и решение делается в течении минуты

Не в сети

#3 18.01.2017 18:48:51

Re: Фильтры для товаров

Dens пишет:

Нужно конечно смотреть на код, поэтому могу с ответом не угадать
Будьте внимательны с

$goods = Goods::create(Request::all());

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

А почему бы вам не добавить ещё один запрос для записи в другие таблицы, раз это админка, значит нагрузка будет не высокой, и решение делается в течении минуты

Вы имеете ввиду через for делать инсертами? Насчет полей знаю, я их указал. Но просто понимаете, при отправки позиций фильтров, у меня нет ид самого фильтра. Конечно можно сделать опять таки через for прогнать выборку по таблице filter_position. Просто я думал, что через отношения можно сделать это и будет код проще.

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

$filter_position = Request::input('filter_position');
       $filter_position = array_map(function ($value) { 
        return (int) $value;
          }, $filter_position); 
       $Filter_id = FilterPosition::with('filter')->whereIn('filter_position_id',  $filter_position)->get(['filters_id'])->toArray();

Изменено fenix1996l (18.01.2017 18:51:52)

Не в сети

#4 18.01.2017 19:39:16

Re: Фильтры для товаров

Затрудняюсь ответить вам
Могу только сказать на своём опыте, сколько раз не делал фильтры у меня всегда передавались ID фильтра
Если фильтров изначально ограниченное количество, то в таблице товаров есть поля с id каждого фильтра.
Итого
При добавлении фильтра передаются просто его ID
При применении фильтра так же передаются его ID
Если фильтра в виде чекбоксов то массив ID

<input type="checkbox" name="brand[]" value="brand_id">

Думаю вам стоит передавать ИД и не мучаться

Не в сети

#5 18.01.2017 20:13:11

Re: Фильтры для товаров

Я так и делаю. Вот смотрите

Вот сами фильтры в админке
asas.png

Чекбосы вот такие
<input type="checkbox" class="flat" name="filter_position[]" value="1" style="position: absolute; opacity: 0;">
где value это ид позиции фильтра, в данном случае это позиция Красный фильтра Цвета, там ниже будет
filters
id  name
1   Цвет
2   Размер

Filters_position
id    Filters_id    name
1    1             красный
2    1             черный
3    2             10см
4    2             15см

Вот что присылает вардамп
asasasas.png

Вот сам код
asassasasadasda.png

Возможно ли сделать это более оптимизирование через отношения? И вот оно как бы работает, да, но теперь при редактировании товара это жесть:)

А сама таблица куда грузится вот
goods.png

Возможно я не так составил таблицу?( Мучаюсь уже 4 дня...

Изменено fenix1996l (18.01.2017 20:13:56)

Не в сети

#6 18.01.2017 20:25:35

Re: Фильтры для товаров

Dens пишет:

Затрудняюсь ответить вам
Могу только сказать на своём опыте, сколько раз не делал фильтры у меня всегда передавались ID фильтра
Если фильтров изначально ограниченное количество, то в таблице товаров есть поля с id каждого фильтра.
Итого
При добавлении фильтра передаются просто его ID
При применении фильтра так же передаются его ID
Если фильтра в виде чекбоксов то массив ID

<input type="checkbox" name="brand[]" value="brand_id">

Думаю вам стоит передавать ИД и не мучаться


Я там еще ответил вам ввыше, забыл процитировать
Нельзя например никак сделать, типо такого

$goods - Goods::with('filters', 'filters_goods', 'filters_position')->find(240);

И получить результат типо такого
тут инфа о товаре, цена, описание и т.д.
filters =>
0 = >
   id => 1
   name => Цвет
   filter_position =>
     0 =>
         id => 1
         name => красный
    1 =>
         id => 2
         name => черный
1 = >         
   id => 2
   name => Размер
   filter_position =>
     0 =>
         id => 10
         name => 10см

Изменено fenix1996l (18.01.2017 20:26:31)

Не в сети

#7 19.01.2017 06:51:28

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Фильтры для товаров

Я думаю тут EAV (Entity Attribute Value) подойдет, и переделал бы таблицы так:
Products
- id
- name
...
Attributes // таблица названий атрибутов. Цвет, размер и тд
- id
- name
Attributes_Value // значения атрибутов. Розовый,100 см и тд
- id
- attribute_id
- name
...
Product_attributes // таблица соединяющая товар и значение атрибута (в вашем случае фильтра). Ведь фильтровать нужно только по значениям.
- id
- product_id
- attribute_value_id
И теперь при добавлении товара, вы отмечаете (чекбокс или радиокнопка), и отправляете массивом

$product = Product::create($request->all()):

If($request->attributes_value) // проверяем,прилетел ли массив с выбранными атрибутами.
{
    $product->aValue()->attach($request->attributes_value): // aValue в данном случае - связь products и attributes_value
}

А затем можно уже фильтровать вот этим способом https://laracasts.com/series/eloquent-t … episodes/4 или через global scope

Не в сети

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