Maison  >  Questions et réponses  >  le corps du texte

Comment filtrer les produits par attributs (couleur, taille, etc.) dans Laravel

<p>Je suis nouveau sur Laravel et je souhaite filtrer des produits spécifiques. </p> <p>J'ai deux tables dans ma base de données, la première est la table <code>products</code> et la seconde est la table <code>attributs</code>. </p> <p><strong>Liste de produits</strong></p> <pre class="brush:php;toolbar:false;">Schema::create('products', function (Blueprint $table) { $table->bigIncrements('id'); $table->BigInteger('category_id')->unsigned()->nullable(); $table->string('nom'); $table->string('code'); $table->integer('status')->default(1); $table->integer('featured')->default(1); $table->string('image'); $table->longText('short_description'); $table->longText('long_description'); $table->horodatages(); })</pré> <p><strong>Tableau des attributs du produit</strong></p> <pre class="brush:php;toolbar:false;">Schema::create('product_attributes', function (Blueprint $table) {. $table->bigIncrements('id'); $table->unsignedBigInteger('product_id'); $table->string('sku'); $table->string('taille'); $table->string('couleur'); $table->string('prix'); $table->string('stock'); $table->horodatages(); })</pré> <p><strong>Relation</strong></p> <p>Parce que j'ai plusieurs attributs pour un seul produit</p> <pre class="brush:php;toolbar:false;">class Le produit étend le modèle { utilisez HasFactory ; attributs de fonction publique() { return $this->hasmany('AppModelsProductAttributes', 'product_id'); } }</pré> <p><strong>Mes fichiers Blade</strong></p> <pre class="brush:php;toolbar:false;"><form action="{{url('/product/filter')}}" method="post"> @csrf <input type="hidden"value="{{$slug}}"name="slug"> <div class = "contrôle personnalisé case à cocher personnalisée d-flex align-items-center justifier-contenu-entre mb-3"> <nom d'entrée="couleur" onchange="javascript:this.form.submit();" type="radio" class="custom-control-input" id="noir" valeur=" ;noir"> <classe d'étiquette="étiquette de contrôle personnalisée" pour="noir">Noir</étiquette> </div> </form></pre> <p>J'ai une fonction dans mon contrôleur</p> <pre class="brush:php;toolbar:false;">boutique de fonctions publiques() { $filter_products = Product::with('attributes')->where(['category_id' => $category->id, 'color' => $request->color]); return view('frontend.shop', compact('filter_products')); }</pré> <p>Je n'obtiens aucun résultat après avoir appliqué cette fonction</p> <p>Veuillez me guider sur la manière de filtrer les produits en fonction d'une taille ou d'une couleur spécifique sur la page frontale du magasin. et quel code sera inclus dans la fonctionnalité du magasin. </p> <p>Veuillez me répondre, je vous remercierai beaucoup</p>
P粉821274260P粉821274260441 Il y a quelques jours578

répondre à tous(2)je répondrai

  • P粉908138620

    P粉9081386202023-08-28 15:59:41

    $brands         = Brand::orderBy('id','DESC')->get();
        $colors         = Color::orderBy('id','DESC')->get();
        $sizes          = Size::orderBy('id','DESC')->get();
        $weights        = Weight::orderBy('id','DESC')->get();
        $tags           = Tag::orderBy('id','DESC')->get();
        try{
            if (!empty($_GET['colors']) || !empty($_GET['brands']) || !empty($_GET['sizes']) || !empty($_GET['weights']) || !empty($_GET['tags'])) {
                $products = Product::where( function($query ){
                    $query->when(!empty(request()->colors) ,function($subquery){
                        $subquery->whereHas('colors', function($subquery)  {
                            $subquery->whereIn('colors.id',request()->colors);
                        });
                    })->when(!empty(request()->sizes) ,function($subquery){
                        $subquery->whereHas('sizes', function($subquery)  {
                            $subquery->whereIn('sizes.id',request()->sizes);
                        });
                    })->when(!empty(request()->weights) ,function($subquery){
                        $subquery->whereHas('weights', function($subquery)  {
                            $subquery->whereIn('weights.id',request()->weights);
                        });
                    })->when(!empty(request()->tags) ,function($subquery){
                        $subquery->whereHas('tags', function($subquery)  {
                            $subquery->whereIn('tags.id',request()->tags);
                        });
                    })->when(!empty(request()->brands) ,function($subquery){
                        $subquery->whereHas('brand', function($subquery)  {
                            $subquery->whereIn('brand_id',request()->brands);
                        });
                    })->when(!empty(request()->is_new) ,function($subquery){
                        $subquery->where('is_new',request()->is_new);
                    })->when(!empty(request()->gender) ,function($subquery){
                        $subquery->where('gender', 'LIKE', "%" . request()->gender . "%");
                    });
                })->paginate(10);
            
                
                return view('front.shop',compact('products','brands','colors','sizes','weights','tags'));
            } else {
                return  redirect()->route('products');
            }
            
        } catch (\Exception $e) {
            toastr()->error(trans('Some thing is wrong please try again'));
            return  redirect()->route('products');
        }

    répondre
    0
  • P粉033429162

    P粉0334291622023-08-28 13:52:36

    Vous devez filtrer par relation, veuillez consulter la documentation

    https://laravel.com/docs/9 .x/eloquent-relationships#querying-relationship-existence

    Exemples Utilisez WhereHas

    $filter_products = Product::with('attributes')
       ->where(['category_id' => $category->id])
       ->whereHas('attributes',function($query) use($request){
          $query->where(['color' => $request->color]);
       });

    Si appliqué nulle part, toutes les propriétés seront restituées

    Vous pouvez empêcher ce comportement en utilisant le même filtre appliqué dans WhereHas

    $filter_products = Product::with(['attributes'=>function($query) use($request){
            $query->where(['color' => $request->color]);
        }])
        ->where(['category_id' => $category->id])
        ->whereHas('attributes',function($query) use($request){
            $query->where(['color' => $request->color]);
        });

    répondre
    0
  • Annulerrépondre