Как улучшить этот запрос Laravel - PullRequest
1 голос
/ 19 июня 2019
$pfilters = ProductFilters
        ::whereIn('Tb_Product_filters.filter_value', $values)
        ->groupBy('Tb_Product_filters.product_id')
        ->join("Tb_Products","Tb_Products.id","Tb_Product_filters.product_id")
        ->join('Tb_Identities', 'Tb_Identities.id', '=', 'Tb_Products.employee_id')
        ->select(
            "Tb_Products.*",
            "Tb_Identities.first_name as fname",
            "Tb_Identities.last_name as lname"
        )
        ->get()
        ->toArray();

Этот запрос дает мне все продукты, которые находятся в массиве значений, я хочу, чтобы только продукт включал все значения, например,

если у меня есть значения = [1,2,3]

это приведенное выше утверждение дает мне любой продукт имеет value_id = 1 или 2, 3

Я хочу, чтобы продукт собрал 3 атрибута, что означает, что только у продукта есть value_id = 1, 2 и 3, поиск должен выполняться во многих строках.

у меня 4 стола товары фильтры filters_value products_filters

Сначала мы начнем с фильтров

любой фильтр имеет одно или несколько filters_values пример: filter = color, filters_value = [красный, синий, зеленый] теперь вы можете установить связь между ними, используя filter_id как ключ forgen

таблица продуктов: при создании продуктов я выбираю фильтр продуктов и значения пример: iphone = [цвет: глоб, ром: 128 Гб] поэтому я буду хранить их в products_filters

таблица products_filter будет содержать; product_id, filter_id, filter_value

Допустим, я хочу продукты с цветом: красный, и 64 ГБ?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019

я исправил это ответ

$values = explode(",", $request->input('values'));
        $organization_id = $request->input('organization_id');
        $prodicts_filters_ids = ProductFilters::whereIn('filter_value', $values)->groupBy("product_id")->select("product_id")->get()->toArray();
        $products_have_values = [];
        foreach ($prodicts_filters_ids as $pfids) {
            $filers = ProductFilters::where([["product_id", $pfids['product_id']]])->Select("filter_value")->get()->toArray();
            $all_product_filters_Values_ids = [];
            foreach ($filers as $filer) {
                $all_product_filters_Values_ids[] = $filer['filter_value'];
            }

            $any_dif = array_diff($values,$all_product_filters_Values_ids);
            if(count($any_dif)<=0){
                $products_have_values[] = $pfids['product_id'];
            }


        }

        $products = Product::where("Tb_Products.organization_id",$organization_id)->whereIn("Tb_Products.id",$products_have_values)
            ->join('Tb_Identities', 'Tb_Identities.id', '=', 'Tb_Products.employee_id')
            ->select(
                "Tb_Products.*",
                "Tb_Identities.first_name as fname",
                "Tb_Identities.last_name as lname"
            )
            ->get()->toArray();


        return $products;
0 голосов
/ 19 июня 2019

Попробуйте это

$pfilters = ProductFilters::select("
SELECT 
TB_PRODUCTS.*,
Tb_Identities.first_name as fname,
Tb_Identities.last_name as lname 
FROM Tb_Product_filters 
JOIN Tb_Products ON TB_Products.id=Tb_Product_filters.product_id 
JOIN Tb_Identities ON Tb_Identities.id=TB_Products.employee_id")
WHERE (Tb_Product_filters.filter_value = '$values[0]' OR Tb_Product_filters.filter_value = '$values[1]' OR Tb_Product_filters.filter_value = '$values[2]')

В зависимости от того, сколько значений в вашем массиве, добавьте «ИЛИ Tb_Product_filters.filter_value = $ values ​​[X]»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...