0
votes

Comment utiliser where () pour les colonnes appartenant à with ()

Je travaille avec le framework Laravel. Je souhaite obtenir les données pour la promotion avec une certaine catégorie.

<b>Table</b><br>

product<br>
------<br>
id<br>
name<br>
price<br>

promotion<br>
----------<br>
id<br>
product_id<br>
discount<br>

category<br>
---------<br>
id<br>
name<br>

product_category<br>
----------------<br>
product_id<br>
category_id<br>

        $promotions = Promotion::with('product')->with('category') 
        ->whereIn('category_id', ['1','2'])
        ->paginate(9);

Promotion model - connect relation for product and category


// relationship with product 
 public function product()
{
    return $this->belongsTo('App\Model\Product');
}
//relationship with category
public function category() 
{
   return $this->belongsToMany('App\Model\Category', 'products_categories', 'product_id', 'category_id');
}

Erreur:

SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'category.id' dans 'clause where' (SQL: sélectionnez count (*) comme agrégat de promotions où catégorie .id dans (1, 2))


0 commentaires

3 Réponses :


2
votes

Essayez ceci:

$promotions = Promotion::with('product.product_category') 
    ->whereIn('category_id', ['1','2'])
    ->paginate(9)

En supposant que vous deviez créer les relations correctes dans les modèles .

Edit:

Dans le modèle Promotion :

//relationship with category
public function product_category() 
{
   return $this->belongsToMany('App\Model\ProductCategory', 'category_id', 'id');
}

et le modèle de produit :

//relationship with category
public function product_category() 
{
   return $this->belongsTo('App\Model\ProductCategory', 'product_id', 'id');
}

Dans le modèle de catégorie :

// relationship with product 
public function product()
{
    return $this->belongsTo('App\Model\Product');
}


4 commentaires

l'erreur est category_id introuvable. J'avais ajouté un modèle de relation à la question


j'avais édité la question pour ajouter une relation entre le modèle


Vous devez modifier cette relation: Catégorie de la fonction publique () {Retour $ Ceci-> ApportTomanany ('App \ Modèle \ Catégorie', 'Produits_Catégories', 'Product_ID', "Product_ID"); }


Hé, je comprends votre question et j'ai trouvé une solution. vérifiez ma réponse modifiée .



1
votes

Que diriez-vous de:

$promotions = Promotion::whereHas('product.category' => function($q){
    return $->whereIn('category_id', ['1','2']);
}) 
->paginate(9);

Si vous souhaitez obtenir toutes les promotions dont la catégorie a un identifiant en 1,2, vous pouvez faire:

$promotions = Promotion::with([ 'product.category' => function($q){
    return $->whereIn('category_id', ['1','2']);
}]) 
->paginate(9);

Vous obtiendrez simplement des promotions et non des catégories. si c'est ce que vous cherchiez.


0 commentaires

1
votes

Vous pouvez simplement utiliser ceci:

$promotions = Promotion::whereHas(
            'product.category',
            function ($q) {
                $q->whereIn('category_id', ['1', '2']);
            })
            ->paginate(9);


0 commentaires