Comment filtrer les produits par attributs (couleur, taille, etc.) dans Laravel
P粉821274260
P粉821274260 2023-08-28 00:17:09
0
2
607
<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粉821274260
P粉821274260

répondre à tous(2)
P粉908138620
$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');
    }
P粉033429162

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]);
    });
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal