Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Релятивный фильтр
Igon  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 10 дней
Карма:




Добрый день, пишу для сайта умный фильтр по аналогии Яндекс.Маркета.
Собственно уже который день озадачился вопросом реализация релятивного фильтра.
Что имеем:
Динамическую форму: (Форма генерируется автоматически, но для наглядности вставил HTML)
<form method="get" action="">
<div>
<label>
Asus</label>
<input
type="checkbox" name="filter[]" value="Asus">
<label>
Acer</label>
<input
type="checkbox" name="filter[]" value="Acer">
<label>
Lenovo</label>
<input
type="checkbox" name="filter[]" value="Lenovo">
</div>
<div>
<label>
2015</label>
<input
type="checkbox" name="filter[]" value="2015">
<label>
2014</label>
<input
type="checkbox" name="filter[]" value="2014">
<label>
2013</label>
<input
type="checkbox" name="filter[]" value="2013">
</div>
<button>
Искать</button>
</form>

После сабмита формы имеется url следующего вида:
site.com?filter=Asus&filter=2015

Так же имеем таблицы в базе данных:
products (id, title)
products_to_filter (id, product_id, filter_id)

Сам обработчик выглядит следующим образом (P.S фреймворк Laravel)

Выборка соответствующих фильтров.
$filter[] = explode(',', $request->input('filter');
$filters = DB::table('products_to_filter')->whereIn('id', $filter)
->get()
->all();
foreach($filters as $row) {$filterArray[] = $row->product_id;}
Выборка продуктов:
$products = DB::table('products')->whereIn('id', $filterArray)->get()->all();

Собственно моя проблема заключается в следующем, фильтр работает, но не совсем так как мне нужно, тобишь при фильтрации, он должен результаты уменьшать, а он же наоборот ищет более углубленно, и как следствие увеличивает кол-во результатов. Как решить данную проблему?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




Цитата (Igon @ 28.09.2016 - 08:23)
site.com?filter=Asus&filter=2015

Судя по форме должно быть site.com?filter[]=Asus&filter[]=2015
Цитата (Igon @ 28.09.2016 - 08:23)
explode(',', $request->input('filter');

В filter ведь массив, что там делает explode?
filter_id в базе - это Asus, Acer, 2015 и т.д? Если так, то у тебя возникнут проблемы, когда, например, будет год выпуска 2015 и емкость аккумулятора 2015. Так же нельзя выбрать Acer или Asus и 2015-2017. Т.е. кроме значения фильтра еще нужно знать имя параметра к которому это значение относится.
Цитата (Igon @ 28.09.2016 - 08:23)
он должен результаты уменьшать

Запрос к products_to_filter должен быть вида (для вашей организации данных, которая не выглядит верной)
select *, count(*) as numberOfUsedFilters 
from products_to_filter
where filter_id in ('Acer', 2015)
group by product_id
having numberOfUsedFilters = 2

В numberOfUsedFilters = 2 проверяем, что для конкретного товара подходят все выбранные фильтры.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Igon  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 7
Пользователь №: 43430
На форуме: 2 месяца, 10 дней
Карма:




Цитата (kaww @ 28.09.2016 - 06:14)
Цитата (Igon @ 28.09.2016 - 08:23)
site.com?filter=Asus&filter=2015

Судя по форме должно быть site.com?filter[]=Asus&filter[]=2015
Цитата (Igon @ 28.09.2016 - 08:23)
explode(',', $request->input('filter');

В filter ведь массив, что там делает explode?
filter_id в базе - это Asus, Acer, 2015 и т.д? Если так, то у тебя возникнут проблемы, когда, например, будет год выпуска 2015 и емкость аккумулятора 2015. Так же нельзя выбрать Acer или Asus и 2015-2017. Т.е. кроме значения фильтра еще нужно знать имя параметра к которому это значение относится.
Цитата (Igon @ 28.09.2016 - 08:23)
он должен результаты уменьшать

Запрос к products_to_filter должен быть вида (для вашей организации данных, которая не выглядит верной)
select *, count(*) as numberOfUsedFilters 
from products_to_filter
where filter_id in ('Acer', 2015)
group by product_id
having numberOfUsedFilters = 2

В numberOfUsedFilters = 2 проверяем, что для конкретного товара подходят все выбранные фильтры.

numberOfUsedFilters обязательно должно быть значение 2? Как поведет себя фильтр, если скажем так будет выборка вроде этого?
select *, count(*) as numberOfUsedFilters 
from products_to_filter
where filter_id in ('Acer','Asus','Lenovo','Diagonal 13.7', 'Core i5')
group by product_id
having numberOfUsedFilters = 2

Заранее благодарен.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 5 дней
Карма: 184




2 - это не константа, а количество выбранных фильтров. Для in ('Acer','Asus','Lenovo','Diagonal 13.7', 'Core i5') будет 5. Но, повторю еще раз, если я правильно понял структуру БД, то и этот подход так же не будет работать хорошо, выше я описал почему. В приведенном запросе необходимо как-то отличать, что 'Acer','Asus','Lenovo' - это значения одного атрибута, 'Diagonal 13.7' - второго, а 'Core i5' - третьего.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса