Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Здравствуйте! Уже облазил весь инет насчет фильтров для товара.
При добавлении товара в админке, есть чекбоксы с фильтрами. Задача в том, что бы при добавлении товара в таблицу 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)
Не в сети
Нужно конечно смотреть на код, поэтому могу с ответом не угадать
Будьте внимательны с
$goods = Goods::create(Request::all());
В модели нужно указать к каким полям открыть доступ а к каким нет, так же если отправить лишнее поле выскочит ошибка
А почему бы вам не добавить ещё один запрос для записи в другие таблицы, раз это админка, значит нагрузка будет не высокой, и решение делается в течении минуты
Не в сети
Нужно конечно смотреть на код, поэтому могу с ответом не угадать
Будьте внимательны с$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)
Не в сети
Затрудняюсь ответить вам
Могу только сказать на своём опыте, сколько раз не делал фильтры у меня всегда передавались ID фильтра
Если фильтров изначально ограниченное количество, то в таблице товаров есть поля с id каждого фильтра.
Итого
При добавлении фильтра передаются просто его ID
При применении фильтра так же передаются его ID
Если фильтра в виде чекбоксов то массив ID
<input type="checkbox" name="brand[]" value="brand_id">
Думаю вам стоит передавать ИД и не мучаться
Не в сети
Я так и делаю. Вот смотрите
Чекбосы вот такие
<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см
Возможно ли сделать это более оптимизирование через отношения? И вот оно как бы работает, да, но теперь при редактировании товара это жесть:)
А сама таблица куда грузится вот
Возможно я не так составил таблицу?( Мучаюсь уже 4 дня...
Изменено fenix1996l (18.01.2017 20:13:56)
Не в сети
Затрудняюсь ответить вам
Могу только сказать на своём опыте, сколько раз не делал фильтры у меня всегда передавались 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)
Не в сети
Я думаю тут 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
Не в сети
Страницы 1