Запрос дает двойной результат вместо одного - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть две таблицы: products и current_product_attribute_values

Я попытался выполнить запрос на объединение, чтобы отфильтровать их согласно атрибуту, выбранному user, но при попытке выполнить это с дополнительным условием это даетмне 2 результата вместо одного он включает первый, который не соответствует по запросу:

select * from `products` inner join `current_product_attribute_values` on `products`.`id` = `current_product_attribute_values`.`product_id` where `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `product_name` LIKE ?

вот мой код контроллера laravel:

 $all = Input::all();  

 $q = Input::get('search_text');

 $att_val = Input::get('attribute_value');

 $subcat = Input::get('subcat_id');

 $subcat_name = DB::table('subcategories')->where('id', $subcat)->value('subcategory_name');

 $brandname = DB::table('brands')->where('subcat_id', $subcat)->value('brand_name');

 $brand_id = DB::table('brands')->where('subcat_id', $subcat)->value('id');

 $product_count = DB::table('products')->where('brand_id', $brand_id)->count();

            if ($q != "") {

// getting multiple same name params    

                $query = DB::table('products');

                $query->join('current_product_attribute_values', 'products.id', '=', 'current_product_attribute_values.product_id');

                $j = 0;

                foreach ($all as $key => $values) {

                    //echo 'my current get key is :  ' . urldecode($key). '<br>';    

                    if ($key == $name[$j]) {

                        $query->where('current_product_attribute_values.attribute_id', '=', $att_id_value[$j]);
                        echo'<br>';
                        print_r($query->toSql());
                        echo'<br>';
                        //echo '<br> key matched and have some value : <br>';
                        //echo count($values);
                        if (count($values) >= 1) {

                             //echo '<br> it has array inside <br>';

                            foreach ($values as $val) {
                                //   or waali query in same attribute                                  
                                echo'<br>';
                                $query->orwhere('current_product_attribute_values.attribute_value_id', '=', $val);

                                print_r($query->toSql());
                                echo'<br>';
                            }
                        }

                        $j++;
                    }
                }

$records = $query->toSql();

                $query->where('product_name', 'LIKE', '%' . $q . '%');

                $records = $query->toSql();

print_r($records);

                $products = $query->paginate(10)->setPath('');

                $pagination = $products->appends(array(
                    'q' => Input::get('q')
                ));

                if (count($products) > 0) {

                    $filters = DB::table('product_attributes')->where('subcategory_id', $subcat)->get(['attribute_title']);
                } else {

                    $filters = array();
                }

                $categories = categories::where('add_to_menu', 1)->with('subcategories')->with('brands')->get();

                $categoryhome = categories::where('add_to_menu', 1)->with('subcategories')->get();

                return view('searchfilter')
                                ->with('productsdata', $products)
                                ->with('filtersdata', $filters)
                                ->with('categories', $categories)
                                ->with('categorieshome', $categoryhome)
                                ->with('subcat_name', $subcat_name)
                                ->with('subcat_id', $subcat)
                                ->with('brandname', $brandname)
                                ->with('product_count', $product_count)
                                ->with('querytext', $q);
            }
            return 'No Details found. Try to search again !';

CurrentProduct_attributes_values tableProducts Table

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

При просмотре ваших таблиц product таблица с id значением 17 имеет две записи в таблице current_product_attribute_values в столбце product_id (я предполагаю, что этот столбециспользуется как внешний ключ для product таблицы).

С помощью select * вы выбираете все столбцов из обеих таблиц.Так что, скорее всего, ваш запрос будет возвращать несколько записей.

Мои предложения:

  • Выбирайте только те столбцы, которые вам нужны.Избегайте использования select * в долгосрочной перспективе, т.е. select product.id, product.description, current_product_attribute_values.attribute_values ......
  • Используйте GROUP BY

Надеюсь, что это поможет.

0 голосов
/ 18 декабря 2018

проще, если вы используете raw sql в качестве вызывающей функции db select.Например:

$query=DB::select("select * from `products` inner join `current_product_attribute_values` on `products`.`id` = `current_product_attribute_values`.`product_id` where `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `current_product_attribute_values`.`attribute_id` = ? or `current_product_attribute_values`.`attribute_value_id` = ? and `product_name` LIKE ?
");

Действительно, вы можете объединить переменные в raw SQL, если вам нужно, например:

$queryBrands = "select id from brands where subcat_id =".$subcat;
//echo $queryBrands
$queryBrands = DB::select($queryBrands);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...