Laravel поиск по фильтру

Ниже приведен мой json для подробного описания продукта с его функциями.

{
"id": 1,
"title": "Moto g4 plus",
"description": "3 GB RAM | 32 GB ROM | Expandable Upto 128 GB\r\n5.5 inch Display\r\n16MP Rear Camera | 5MP Front Camera\r\n3000 mAh Battery",
"price": "14999.00",
"featured_image": "featured_image/qzHWpQeSfKjZ6DOS59ROyYboJ1GCvVi6NNVfLtVV.jpeg",
"category_id": 1,
"brand_id": 4,
"created_at": "2017-07-13 14:59:53",
"updated_at": "2017-07-13 15:07:49",
"deleted_at": null,
"features": [
                {
                "id": 3,
                "name": "RAM",
                "parent_id": 1,
                "created_at": "2017-07-02 17:42:36",
                "updated_at": "2017-07-02 17:42:36",
                "default_value": "",
                "pivot": {
                "product_id": 1,
                "feature_id": 3,
                "value": "3"
                   }
                },
                {
                "id": 10,
                "name": "Expandable memory",
                "parent_id": 1,
                "created_at": "2017-07-05 15:43:29",
                "updated_at": "2017-07-05 15:43:29",
                "default_value": "",
                "pivot": {
                "product_id": 1,
                "feature_id": 10,
                "value": "32"
                    }
                },
}

теперь я хочу фильтровать поиск по функциям, например, хочу телефон с ОЗУ 4 ГБ и расширяемой памятью 64 ГБ. и я хочу получить результат в соответствии со всем фильтром и дать мне точный результат в соответствии с раскрывающимся списком. На скриншоте ниже показано, как пользователь выбирает функции. скриншот

Ниже приведена моя таблица базы данных для продукта и сводка для функции продукта  Продукт < img src = "https://i.stack.imgur.com/8rmkN.png" alt = "product_feature"> Как и в таблице выше, как я хранил свой продукт и его характеристики с указанием ценности продукта.

Ниже мой код модели

public function features()
{
    return $this->belongsToMany('App\Feature')->withPivot('value');
}

Contoller.php

function searchedFeatures(Request $request)
{
    return $products = Product::with(['features' => function($q){
        $q->where('name','=','ram');
        $q->where('name','=','operating system');
    }])->get();
}

Это даст мне результирующий пустой массив функций, и я хочу проверить имя функции и ее значение, например, продукт имеет оперативную память 4 ГБ или продукт имеет расширяемую память 32 ГБ и т.д., и в результате получится массив всех совпадающих продуктов.


person Nileshsinh Rathod    schedule 07.08.2017    source источник
comment
Вы имеете в виду, что хотите использовать значения запроса для фильтрации результатов запроса?   -  person Oluwatobi Samuel Omisakin    schedule 07.08.2017
comment
@OmisakinOluwatobi Я хочу, чтобы выбранное значение из раскрывающегося списка было отфильтровано из массива json и дало мне результат, например, если я выберу 4 ГБ оперативной памяти из раскрывающегося списка, тогда соответствующий продукт, у которого есть 4 ГБ оперативной памяти, даст мне результат, а в сводном значении будет значение такой функции, как ram.   -  person Nileshsinh Rathod    schedule 07.08.2017
comment
@Nileshsingh, не могли бы вы показать, что вы получаете в виде запроса в своем контроллере, когда выбираете это раскрывающееся меню?   -  person Oluwatobi Samuel Omisakin    schedule 07.08.2017
comment
Вы должны использовать whereHas вместо with. Некоторое время назад я тоже попал в эту ловушку.   -  person Alex    schedule 10.08.2017


Ответы (3)


Используйте метод orWhere(), это должна быть недостающая часть вашего запроса

return $products = Product::with(['features' => function($q){
    $q->where('name','=','ram')
      ->orWhere('os','=','operating system');
}])->get();
person Oluwatobi Samuel Omisakin    schedule 07.08.2017

Попробовав так много вещей и исследований, я нашел решение с использованием запроса БД путем самостоятельного присоединения к таблице, как показано ниже. Если у кого-то есть лучшее решение, поделитесь здесь.

function searchedFeatures(Request $request)
{
    $ram = Feature::where('name','ram')->first();
    $processor = Feature::where('name','processor technology')->first();
    $screen = Feature::where('name','screen size')->first();
    $battery = Feature::where('name','battery capacity')->first();
    $os = Feature::where('name','operating system')->first();
    $mainCamera = Feature::where('name','main camera')->first();
    $selfieCamera = Feature::where('name','selfie camera')->first();
    $price = Feature::where('name','price')->first();
    //return $request->all();
    $products = DB::table('products AS p')
                ->select('p.id','p.title','p.price','p.featured_image','r.value AS ram','pro.value as processor','s.value AS screen','b.value AS battery','os.value AS os','mc.value AS main_camera','sc.value AS selfie_camera')
                ->leftJoin('feature_product as r','r.product_id','=','p.id')
                ->leftJoin('feature_product as pro','pro.product_id','=','p.id')
                ->leftJoin('feature_product as s','s.product_id','=','p.id')
                ->leftJoin('feature_product as b','b.product_id','=','p.id')
                ->leftJoin('feature_product as os','os.product_id','=','p.id')
                ->leftJoin('feature_product as mc','mc.product_id','=','p.id')
                ->leftJoin('feature_product as sc','sc.product_id','=','p.id')
                ->where('r.feature_id','=',$ram->id)
                ->where('pro.feature_id','=',$processor->id)
                ->where('s.feature_id','=',$screen->id)
                ->where('b.feature_id','=',$battery->id)
                ->where('os.feature_id','=',$os->id)
                ->where('mc.feature_id','=',$mainCamera->id)
                ->where('sc.feature_id','=',$selfieCamera->id)
                ->where('r.value','LIKE',isset($request->ram)? $request->ram:NULL)
                ->where('pro.value','LIKE',isset($request->processor)?$request->processor.'-core':NULL)
                ->whereBetween('s.value',isset($request->screen)?(explode(',', $request->screen)):[1,100] )
                ->whereBetween('b.value',isset($request->battery)?(explode(',', $request->battery)):[1000,5000] )
                ->where('os.value','LIKE',isset($request->os)? $request->os:NULL)
                ->whereBetween('mc.value',isset($request->main_camera)?(explode(',', $request->main_camera)):[2,50] )
                ->whereBetween('sc.value',isset($request->selfie_camera)?(explode(',', $request->selfie_camera)):[2,50] )
                ->whereBetween('p.price',isset($request->price)?(explode(',', $request->price)):[1000,80000] )
                ->get();
    $categoryPage=true;                    
    return view('product.searched',compact(['products','categoryPage']));

}
person Nileshsinh Rathod    schedule 10.08.2017

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

function searchedFeatures(Request $request)
{
    return $products = Product::with(['features' => function($q){
        $q->where('name','=',$request->ram);
        $q->where('os','=',$request->operating_system);
    }])->get();
}

Если он ничего не возвращает, вероятно, он не соответствует тому, что находится в базе данных. Вы уверены, что введенные значения верны и аналогичны тем, что есть в БД?

person connormcwood    schedule 07.08.2017